Вопрос следующий: Как заставить препроцессор в GCC обрабатывать комментарии ПОСЛЕ всех подстановок, а не ДО, тоесть так-же как это делается в мелкомягком VC? B возможно ли это вообще.
Здравствуйте, __ersh__, Вы писали:
___>Вопрос следующий: Как заставить препроцессор в GCC обрабатывать комментарии ПОСЛЕ всех подстановок, а не ДО, тоесть так-же как это делается в мелкомягком VC? B возможно ли это вообще.
Порядок фаз компиляции жестко определен в стандарте. С большой вероятностью вашу задачу решит либо внешний препроцессор либо кодогенерация.
Re: порядок препроцессинга а GCC
От:
Аноним
Дата:
22.02.10 05:49
Оценка:
Здравствуйте, __ersh__, Вы писали:
___>Вопрос следующий: Как заставить препроцессор в GCC обрабатывать комментарии ПОСЛЕ всех подстановок, а не ДО, тоесть так-же как это делается в мелкомягком VC? B возможно ли это вообще.
Здравствуйте, __ersh__, Вы писали:
___>Вопрос следующий: Как заставить препроцессор в GCC обрабатывать комментарии ПОСЛЕ всех подстановок, а не ДО, тоесть так-же как это делается в мелкомягком VC? B возможно ли это вообще.
зачем?
ЗЫ В функции препроцессора входит уничтожение комментариев, так что вопрос некорректен. Если у тебя вдруг токены складываются в комментарий, то это UB
Здравствуйте, jazzer, Вы писали:
J>Здравствуйте, __ersh__, Вы писали:
___>>Вопрос следующий: Как заставить препроцессор в GCC обрабатывать комментарии ПОСЛЕ всех подстановок, а не ДО, тоесть так-же как это делается в мелкомягком VC? B возможно ли это вообще.
J>зачем?
J>ЗЫ В функции препроцессора входит уничтожение комментариев, так что вопрос некорректен. Если у тебя вдруг токены складываются в комментарий, то это UB
Да, при определенных условиях они складывались в комментарий
Здравствуйте, __ersh__, Вы писали:
___>И на VC(как теперь понятно не следующему стандарту) это работало. Стали портировать на линь — не вышло. ___>Может есть другие варианты решить задачу?
Здравствуйте, Бабошин Андрей, Вы писали:
БА>Здравствуйте, __ersh__, Вы писали:
___>>И на VC(как теперь понятно не следующему стандарту) это работало. Стали портировать на линь — не вышло. ___>>Может есть другие варианты решить задачу?
БА>Функция с переменным числом аргументов.
Вы думаете я об этом не подумал)
Темплейтная функция с переменным числом аргументов приведет как минимум к static_cast, который не особо люблю.
Но по видимому так и придется сделать.
Здравствуйте, ДимДимыч, Вы писали:
ДД>Здравствуйте, __ersh__, Вы писали:
___>>Может есть другие варианты решить задачу?
ДД>Если хочется поиграться с макросами, то можно что-то типа такого: ДД>
ДД>#define REG_PARAMETER(name, ...) \
ДД> do { \
ДД> if (sizeof(#__VA_ARGS__) > 1) \
ДД> name = (name, ##__VA_ARGS__); \
ДД> foo(#name, name); \
ДД> } while (0)
ДД>
ДД>Но смущает "warning: left-hand operand of comma expression has no effect" при использовании макроса с двумя агрументами.
не совсем понял смысл этой строки name = (name, ##__VA_ARGS__); , если можно объясните.
Здравствуйте, __ersh__, Вы писали:
___>не совсем понял смысл этой строки name = (name, ##__VA_ARGS__); , если можно объясните.
Если __VA_ARGS__ не пустой, то просто подставляется его значение. Имеет место оператор "запятая", возвращается последнее значение, т.е. то, что в __VA_ARGS__.
Если __VA_ARGS__ пустой, срабатывает префикс ## (это специфика GCC), который "нейтрализует" запятую, что перед ним. Таким образом получается name = (name), что оптимизатор с радостью уберет (если, конечно, name не имеет аттрибута volatile). Но до генерации этого кода даже не должно дойти, так как под if'ом сравнение констант, известных на момент компиляции, оптимизатор должен справиться.
Обязательно бахнем! И не раз. Весь мир в труху! Но потом. (ДМБ)
Здравствуйте, ДимДимыч, Вы писали:
ДД>Здравствуйте, __ersh__, Вы писали:
___>>не совсем понял смысл этой строки name = (name, ##__VA_ARGS__); , если можно объясните.
ДД>Если __VA_ARGS__ не пустой, то просто подставляется его значение. Имеет место оператор "запятая", возвращается последнее значение, т.е. то, что в __VA_ARGS__. ДД>Если __VA_ARGS__ пустой, срабатывает префикс ## (это специфика GCC), который "нейтрализует" запятую, что перед ним. Таким образом получается name = (name), что оптимизатор с радостью уберет (если, конечно, name не имеет аттрибута volatile). Но до генерации этого кода даже не должно дойти, так как под if'ом сравнение констант, известных на момент компиляции, оптимизатор должен справиться.
Если требуются слишком сложные макросы — значит вам нужно писать кодогенератор. Проще, быстрее, понятнее, и, самое главное, портабельнее и по стандартам.
партировать — epic fail А>Если требуются слишком сложные макросы — значит вам нужно писать кодогенератор. Проще, быстрее, понятнее, и, самое главное, портабельнее и по стандартам.
Мне не требуется.
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]