2016-12-14 2 views
0

Я ищу способ сделать макрос, который расширяется к дополнительным аргументам:макро расширения для дополнительных аргументов макросов

int constant1=2, constant2=3; 
#define add_three_arguments(x,y,z) x+y+z 
#define extra_arguments ,constant1,constant2 
#define make_value(A) add_three_arguments(A extra_arguments) 

int r = make_value(5); 
+2

Зачем нужен макрос, хотя вы можете использовать функцию для этого? –

+1

Непосредственно, бит __never__ определяет макросы типа '#define add_three_arguments (x, y, z) x + y + z', но всегда помещает выражение в'() 'следующим образом:' #define add_three_arguments (x, y, z) (x + y + z) '. В противном случае, если вы используете 'x = add_three_arguments (1,2,3) * 10', результат будет не таким, как вы ожидаете. –

+1

Это действительно помогло бы, если бы вы сказали нам цель более высокого уровня, которую вы пытаетесь достичь здесь. –

ответ

0

Попробуйте следующее:

#define EMPTY 
#define EVAL(X) X 
#define add_three_arguments(x,y,z) x+y+z 
#define extra_arguments ,constant1,constant2 
#define make_value(A) EVAL(add_three_arguments EMPTY (A extra_arguments)) 

make_value(5); 

Однако, если вы редизайн макросов вы можете получить более приятное решение, не требующее таких конструкций.

0

Ближайшим решение, которое я нашел это:

int constant1=2, constant2=3; 
#define _add_three_arguments(x,y,z) x+y+z 
#define add_three_arguments(...) _add_three_arguments(__VA_ARGS__) 

#define extra_arguments ,constant1,constant2 
#define make_value(A) add_three_arguments(A extra_arguments) 

int r = make_value(5); 

Который, конечно, не решение проблемы я заявил. Таким образом, текущий ответ, похоже, «это невозможно». Но, возможно, новая версия clang/gcc каким-то образом включит это. Я оставлю вопрос открытым.