препроцессор и ,
От: WiseAlex Беларусь  
Дата: 04.05.06 12:14
Оценка:
в макрос нужно передать список инициализации
делаю по-простому
#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
как преодолеть проблему?
Re: коррекция
От: WiseAlex Беларусь  
Дата: 04.05.06 12:25
Оценка:
WA>
WA>#define MY_MACRO(a) int aVar[]={a}; //здесь нормально 
WA>#define MY_MACRO(a) int aVar[]=SOME_OTHER_MACRO(a); //здесь проблема
WA>
Re: препроцессор и ,
От: Vain Россия google.ru
Дата: 04.05.06 20:09
Оценка:
Здравствуйте, WiseAlex, Вы писали:

WA>как преодолеть проблему?

#define _E1(x1) x1
#define _E2(x1,x2) x1,x2
#define _E3(x1,x2,x3) x1,x2,x3
#define _E4(x1,x2,x3,x4) x1,x2,x3,x4
//и т.д.

MY_MACRO(_E3(1,2,3))


так пойдёть?
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Re: препроцессор и ,
От: Chorkov Россия  
Дата: 05.05.06 06:54
Оценка: 7 (1)
Здравствуйте, 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>как преодолеть проблему?

Попробуй:
#define COMMA_0 ,
#define COMMA_1 COMMA_0
#define COMMA_2 COMMA_1
#define COMMA_3 COMMA_2
#define COMMA_4 COMMA_3
#define COMMA_5 COMMA_4
#define COMMA_6 COMMA_5
#define COMMA_7 COMMA_6
#define COMMA_8 COMMA_7
#define COMMA_9 COMMA_8
#define COMM COMMA_9
MY_MACRO(1 COMM 2 COMM 3)

сработает, если вложенность макросов в SOME_OTHER_MACRO не слишком велика.
Re[2]: препроцессор и ,
От: WiseAlex Беларусь  
Дата: 05.05.06 07:32
Оценка:
Здравствуйте, Vain, Вы писали:

V>
V>#define _E1(x1) x1
V>#define _E2(x1,x2) x1,x2
V>#define _E3(x1,x2,x3) x1,x2,x3
V>#define _E4(x1,x2,x3,x4) x1,x2,x3,x4
V>//и т.д.

V>MY_MACRO(_E3(1,2,3))
V>


V>так пойдёть?

это слишком сложно для пользовательского кода да и список инициализации может быть таким {1 COMMA 2} COMMA {3 COMMA 4}
Re[2]: препроцессор и ,
От: WiseAlex Беларусь  
Дата: 05.05.06 07:37
Оценка:
Здравствуйте, Chorkov, Вы писали:

C>Попробуй:

C>
C>#define COMMA_0 ,
C>#define COMMA_1 COMMA_0
C>#define COMMA_2 COMMA_1
C>#define COMMA_3 COMMA_2
C>#define COMMA_4 COMMA_3
C>#define COMMA_5 COMMA_4
C>#define COMMA_6 COMMA_5
C>#define COMMA_7 COMMA_6
C>#define COMMA_8 COMMA_7
C>#define COMMA_9 COMMA_8
C>#define COMM COMMA_9
C>MY_MACRO(1 COMM 2 COMM 3)
C>

C>сработает, если вложенность макросов в SOME_OTHER_MACRO не слишком велика.
Спасибо — наверное то, что нужно. Я пробовал
#define COMMA_0 ,
#define COMMA COMMA_0

,но видно не дотянул (сказывается плохое понимание работы препроцессора)
Кстати где можно посмотреть белее подробно о работе препроцессора — с учетом всяких нюансов?
Re: препроцессор и ,
От: LuciferMoscow Россия  
Дата: 05.05.06 07:42
Оценка:
Здравствуйте, WiseAlex, Вы писали:
Может
http://boost.org/libs/preprocessor/doc/index.html
спасет?
Re[2]: препроцессор и ,
От: WiseAlex Беларусь  
Дата: 05.05.06 08:01
Оценка:
Здравствуйте, Chorkov, Вы писали:

C>Попробуй:

C>
C>#define COMMA_0 ,
C>#define COMMA_1 COMMA_0
C>#define COMMA_2 COMMA_1
C>#define COMMA_3 COMMA_2
C>#define COMMA_4 COMMA_3
C>#define COMMA_5 COMMA_4
C>#define COMMA_6 COMMA_5
C>#define COMMA_7 COMMA_6
C>#define COMMA_8 COMMA_7
C>#define COMMA_9 COMMA_8
C>#define COMM COMMA_9
C>MY_MACRO(1 COMM 2 COMM 3)
C>

попробовал так:
#define THE_SAME(Param) Param
#define MY_MACRO(a)  int array[]={THE_SAME(a)};

MY_MACRO(1 COMM 2 COMM 3)

этот вариант работает и для #define COMM ,
следующий вариант не работает ни при каком уровне косвенности COMM:
#define THE_SAME(Param) Param
#define MY_MACRO(a) int array[]={THE_SAME(THE_SAME(a))};

MY_MACRO(1 COMM 2 COMM 3)

раскрывается в
int array[]={1};

с предупреждением о слишком большом количестве параметров
(сейчас использую VC2005)
Re[2]: препроцессор и ,
От: WiseAlex Беларусь  
Дата: 05.05.06 08:07
Оценка:
Здравствуйте, LuciferMoscow, Вы писали:

LM>Может

LM>http://boost.org/libs/preprocessor/doc/index.html
LM>спасет?
интересно чем он меня спасет в данной ситуации? у меня проблема в использовании списка инициализации с этим самым boost::preprocessor
может я что-то и пропустил в документации, тогда буду благодарен если укажете что именно
Re: препроцессор и ,
От: _nn_ www.nemerleweb.com
Дата: 05.05.06 08:09
Оценка: +1
Здравствуйте, 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))
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[3]: препроцессор и ,
От: Vain Россия google.ru
Дата: 05.05.06 13:29
Оценка:
Здравствуйте, 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.]
[Даю очевидные ответы на риторические вопросы]
Re[4]: препроцессор и ,
От: WiseAlex Беларусь  
Дата: 05.05.06 14:40
Оценка:
Здравствуйте, 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)
Re[5]: препроцессор и ,
От: Vain Россия google.ru
Дата: 05.05.06 17:58
Оценка:
Здравствуйте, 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.]
[Даю очевидные ответы на риторические вопросы]
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.