в макрос нужно передать список инициализации
делаю по-простому
#define COMMA ,
MY_MACRO(1 COMM 2 COMM 3)
проблема возникает, когда макрос становится сложным и необходимо передавать этот список как параметр другому макросу (использую boost::preprocessor)
т.е.
#define MY_MACRO(a) int aVar[]=a; //здесь нормально #define MY_MACRO(a) int aVar[]=SOME_OTHER_MACRO(a); //здесь проблема
во втором случае параметр раскрывается и в SOME_OTHER_MACRO передается 1,2,3 ,что интерпретируется как парамер 1 и лишние параметры 2.3
как преодолеть проблему?
Здравствуйте, WiseAlex, Вы писали:
WA>в макрос нужно передать список инициализации WA>делаю по-простому WA>
WA>#define COMMA ,
WA>MY_MACRO(1 COMM 2 COMM 3)
WA>
WA>проблема возникает, когда макрос становится сложным и необходимо передавать этот список как параметр другому макросу (использую boost::preprocessor) WA>т.е. WA>
WA>#define MY_MACRO(a) int aVar[]=a; //здесь нормально
WA>#define MY_MACRO(a) int aVar[]=SOME_OTHER_MACRO(a); //здесь проблема
WA>
WA>во втором случае параметр раскрывается и в SOME_OTHER_MACRO передается 1,2,3 ,что интерпретируется как парамер 1 и лишние параметры 2.3 WA>как преодолеть проблему?
C>сработает, если вложенность макросов в SOME_OTHER_MACRO не слишком велика.
Спасибо — наверное то, что нужно. Я пробовал
#define COMMA_0 ,
#define COMMA COMMA_0
,но видно не дотянул (сказывается плохое понимание работы препроцессора)
Кстати где можно посмотреть белее подробно о работе препроцессора — с учетом всяких нюансов?
Здравствуйте, LuciferMoscow, Вы писали:
LM>Может LM>http://boost.org/libs/preprocessor/doc/index.html LM>спасет?
интересно чем он меня спасет в данной ситуации? у меня проблема в использовании списка инициализации с этим самым boost::preprocessor
может я что-то и пропустил в документации, тогда буду благодарен если укажете что именно
Здравствуйте, WiseAlex, Вы писали:
WA>в макрос нужно передать список инициализации WA>делаю по-простому WA>
WA>#define COMMA ,
WA>MY_MACRO(1 COMM 2 COMM 3)
WA>
WA>проблема возникает, когда макрос становится сложным и необходимо передавать этот список как параметр другому макросу (использую boost::preprocessor) WA>т.е. WA>
WA>#define MY_MACRO(a) int aVar[]=a; //здесь нормально
WA>#define MY_MACRO(a) int aVar[]=SOME_OTHER_MACRO(a); //здесь проблема
WA>
WA>во втором случае параметр раскрывается и в SOME_OTHER_MACRO передается 1,2,3 ,что интерпретируется как парамер 1 и лишние параметры 2.3 WA>как преодолеть проблему?
Советую почитать вам еще про Boost.Preprocessor и использовать последовательность (sequence) при передачи аргументов:
MY_MACRO((1)(2)(3))
Здравствуйте, WiseAlex, Вы писали:
V>>так пойдёть? WA>это слишком сложно для пользовательского кода да и список инициализации может быть таким {1 COMMA 2} COMMA {3 COMMA 4}
да куда проще, чем изврат с boostом и подобным: MY_MACRO(_E4({1,2},{3,4}))
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Здравствуйте, Vain, Вы писали:
WA>>это слишком сложно для пользовательского кода да и список инициализации может быть таким {1 COMMA 2} COMMA {3 COMMA 4} V>да куда проще, чем изврат с boostом и подобным: MY_MACRO(_E4({1,2},{3,4}))
Такой подход в чем то проще, но не устраняет проблему с двойным вызовом таким как ANOTHER_MACRO(MY_MACRO_VAR_LIST_PARAM)
Здравствуйте, WiseAlex, Вы писали:
WA>>>это слишком сложно для пользовательского кода да и список инициализации может быть таким {1 COMMA 2} COMMA {3 COMMA 4} V>>да куда проще, чем изврат с boostом и подобным: MY_MACRO(_E4({1,2},{3,4})) WA>Такой подход в чем то проще, но не устраняет проблему с двойным вызовом таким как ANOTHER_MACRO(MY_MACRO_VAR_LIST_PARAM)
покажи пример который не компилиться
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]