порядок препроцессинга а GCC
От: __ersh__  
Дата: 21.02.10 15:44
Оценка:
Вопрос следующий: Как заставить препроцессор в GCC обрабатывать комментарии ПОСЛЕ всех подстановок, а не ДО, тоесть так-же как это делается в мелкомягком VC? B возможно ли это вообще.
gcc
Re: порядок препроцессинга а GCC
От: Аноним  
Дата: 21.02.10 16:22
Оценка:
Здравствуйте, __ersh__, Вы писали:

___>Вопрос следующий: Как заставить препроцессор в GCC обрабатывать комментарии ПОСЛЕ всех подстановок, а не ДО, тоесть так-же как это делается в мелкомягком VC? B возможно ли это вообще.


Порядок фаз компиляции жестко определен в стандарте. С большой вероятностью вашу задачу решит либо внешний препроцессор либо кодогенерация.
Re: порядок препроцессинга а GCC
От: Аноним  
Дата: 22.02.10 05:49
Оценка:
Здравствуйте, __ersh__, Вы писали:

___>Вопрос следующий: Как заставить препроцессор в GCC обрабатывать комментарии ПОСЛЕ всех подстановок, а не ДО, тоесть так-же как это делается в мелкомягком VC? B возможно ли это вообще.


Можно пример?
Re: порядок препроцессинга а GCC
От: jazzer Россия Skype: enerjazzer
Дата: 22.02.10 06:48
Оценка:
Здравствуйте, __ersh__, Вы писали:

___>Вопрос следующий: Как заставить препроцессор в GCC обрабатывать комментарии ПОСЛЕ всех подстановок, а не ДО, тоесть так-же как это делается в мелкомягком VC? B возможно ли это вообще.


зачем?

ЗЫ В функции препроцессора входит уничтожение комментариев, так что вопрос некорректен. Если у тебя вдруг токены складываются в комментарий, то это UB
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[2]: порядок препроцессинга а GCC
От: __ersh__  
Дата: 22.02.10 09:04
Оценка:
Здравствуйте, jazzer, Вы писали:

J>Здравствуйте, __ersh__, Вы писали:


___>>Вопрос следующий: Как заставить препроцессор в GCC обрабатывать комментарии ПОСЛЕ всех подстановок, а не ДО, тоесть так-же как это делается в мелкомягком VC? B возможно ли это вообще.


J>зачем?


J>ЗЫ В функции препроцессора входит уничтожение комментариев, так что вопрос некорректен. Если у тебя вдруг токены складываются в комментарий, то это UB


Да, при определенных условиях они складывались в комментарий

Был вот такой макрос

#define S_S(def) def
#define MAKE_PARAMETER(name, def) \
S_S(/S_S(**def)/S_S()/S_S(def*)/S_S(name=def/S_S(**)/) \
regBunch(#name,Bunch(name));

#if WIN32
#define REG_PARAMETER(name,...) MAKE_PARAMETER(name,__VA_ARGS__)
#elif __linux__
#define REG_PARAMETER(name,args...) MAKE_PARAMETER(name,args)
#endif

который с помощью игр с комментариями делал следующее:

— при отсутствии второго параметра просто вызывал regBunch(...);

— если второй параметр был, то сначала он присваивал первому его значение (name = def а потом уже вызывал regBunch(...);


И на VC(как теперь понятно не следующему стандарту) это работало. Стали портировать на линь — не вышло.
Может есть другие варианты решить задачу?
Re[3]: порядок препроцессинга а GCC
От: Бабошин Андрей Германия http://andreybaboshin.livejournal.com/
Дата: 22.02.10 09:54
Оценка:
Здравствуйте, __ersh__, Вы писали:

___>И на VC(как теперь понятно не следующему стандарту) это работало. Стали портировать на линь — не вышло.

___>Может есть другие варианты решить задачу?

Функция с переменным числом аргументов.
Re[4]: порядок препроцессинга а GCC
От: __ersh__  
Дата: 22.02.10 10:04
Оценка:
Здравствуйте, Бабошин Андрей, Вы писали:

БА>Здравствуйте, __ersh__, Вы писали:


___>>И на VC(как теперь понятно не следующему стандарту) это работало. Стали портировать на линь — не вышло.

___>>Может есть другие варианты решить задачу?

БА>Функция с переменным числом аргументов.


Вы думаете я об этом не подумал)

Темплейтная функция с переменным числом аргументов приведет как минимум к static_cast, который не особо люблю.
Но по видимому так и придется сделать.
Re[3]: порядок препроцессинга а GCC
От: ДимДимыч Украина http://klug.org.ua
Дата: 22.02.10 21:04
Оценка:
Здравствуйте, __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" при использовании макроса с двумя агрументами.
Обязательно бахнем! И не раз. Весь мир в труху! Но потом. (ДМБ)
Re[4]: порядок препроцессинга а GCC
От: __ersh__  
Дата: 22.02.10 23:26
Оценка:
Здравствуйте, ДимДимыч, Вы писали:

ДД>Здравствуйте, __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__); , если можно объясните.
Re[3]: порядок препроцессинга а GCC
От: TimurSPB Интернет  
Дата: 22.02.10 23:37
Оценка: +3
___>Был вот такой макрос

___>#define S_S(def) def

___>#define MAKE_PARAMETER(name, def) \
___> S_S(/S_S(**def)/S_S()/S_S(def*)/S_S(name=def/S_S(**)/) \
___> regBunch(#name,Bunch(name));

___>#if WIN32

___> #define REG_PARAMETER(name,...) MAKE_PARAMETER(name,__VA_ARGS__)
___>#elif __linux__
___> #define REG_PARAMETER(name,args...) MAKE_PARAMETER(name,args)
___>#endif

OMG
Make flame.politics Great Again!
Re[5]: порядок препроцессинга а GCC
От: ДимДимыч Украина http://klug.org.ua
Дата: 23.02.10 09:42
Оценка:
Здравствуйте, __ersh__, Вы писали:

___>не совсем понял смысл этой строки name = (name, ##__VA_ARGS__); , если можно объясните.


Если __VA_ARGS__ не пустой, то просто подставляется его значение. Имеет место оператор "запятая", возвращается последнее значение, т.е. то, что в __VA_ARGS__.
Если __VA_ARGS__ пустой, срабатывает префикс ## (это специфика GCC), который "нейтрализует" запятую, что перед ним. Таким образом получается name = (name), что оптимизатор с радостью уберет (если, конечно, name не имеет аттрибута volatile). Но до генерации этого кода даже не должно дойти, так как под if'ом сравнение констант, известных на момент компиляции, оптимизатор должен справиться.
Обязательно бахнем! И не раз. Весь мир в труху! Но потом. (ДМБ)
Re[6]: порядок препроцессинга а GCC
От: __ersh__  
Дата: 23.02.10 13:06
Оценка:
Здравствуйте, ДимДимыч, Вы писали:

ДД>Здравствуйте, __ersh__, Вы писали:


___>>не совсем понял смысл этой строки name = (name, ##__VA_ARGS__); , если можно объясните.


ДД>Если __VA_ARGS__ не пустой, то просто подставляется его значение. Имеет место оператор "запятая", возвращается последнее значение, т.е. то, что в __VA_ARGS__.

ДД>Если __VA_ARGS__ пустой, срабатывает префикс ## (это специфика GCC), который "нейтрализует" запятую, что перед ним. Таким образом получается name = (name), что оптимизатор с радостью уберет (если, конечно, name не имеет аттрибута volatile). Но до генерации этого кода даже не должно дойти, так как под if'ом сравнение констант, известных на момент компиляции, оптимизатор должен справиться.

Спасибо за пояснение.
Re[4]: порядок препроцессинга а GCC
От: Vain Россия google.ru
Дата: 26.02.10 18:27
Оценка:
Здравствуйте, TimurSPB, Вы писали:

___>>#define S_S(def) def

___>>#define MAKE_PARAMETER(name, def) \
___>> S_S(/S_S(**def)/S_S()/S_S(def*)/S_S(name=def/S_S(**)/) \
___>> regBunch(#name,Bunch(name));

___>>#if WIN32

___>> #define REG_PARAMETER(name,...) MAKE_PARAMETER(name,__VA_ARGS__)
___>>#elif __linux__
___>> #define REG_PARAMETER(name,args...) MAKE_PARAMETER(name,args)
___>>#endif

TSP>OMG

Чувак решил мою залипуху
Автор: Vain
Дата: 08.06.06
партировать — epic fail
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Re[5]: порядок препроцессинга а GCC
От: Аноним  
Дата: 26.02.10 23:13
Оценка:
Здравствуйте, Vain, Вы писали:

V>Чувак решил мою залипуху
Автор: Vain
Дата: 08.06.06
партировать — epic fail


Если требуются слишком сложные макросы — значит вам нужно писать кодогенератор. Проще, быстрее, понятнее, и, самое главное, портабельнее и по стандартам.
Re[6]: порядок препроцессинга а GCC
От: Vain Россия google.ru
Дата: 27.02.10 13:32
Оценка:
Здравствуйте, Аноним, Вы писали:

V>>Чувак решил мою залипуху
Автор: Vain
Дата: 08.06.06
партировать — epic fail

А>Если требуются слишком сложные макросы — значит вам нужно писать кодогенератор. Проще, быстрее, понятнее, и, самое главное, портабельнее и по стандартам.
Мне не требуется.
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.