2013-07-11 78 views
1

我在我的C代码中有两个宏帮助我编写某些变量的名称。作为一个例子,考虑以下因素:如何将宏的结果传递给另一个宏?

#define MACROA(name) A_##name 
#define MACROB(name) B_##name 

void *MACROB(MACROA(object)); 

所以,我想声明一个叫做B_A_object变量。然而,这并不工作,编译器会引发我的留言:

object.c:27:21: error: a parameter list without types is only allowed in a function definition 
void *MACROB(MACROA(object)); 
        ^
object.c:26:26: note: expanded from macro 'MACROB' 
#define MACROB(name) B_##name 
         ^

所以,似乎预处理未服用的MACROA(object)的结果,但它正在考虑表达式本身,以便它试图让B_MACROA(object) 。那么,我需要做些什么才能使预处理器考虑将宏传递给另一个宏的结果呢?

+0

如果这不是学习/测试目的,你应该尝试,如果你能避免它。 – Xaqq

+0

@Xaqq不,不幸的是我必须遵循由两个宏强加的命名约定...... – LuisABOL

回答

3

串联运算符的行为很奇怪。它加到第一和后评价:

void *MACROB(MACROA(object)); // The original line 
void *B_MACROA(object);  // Becomes this, nothing more to expand 

可以解决这样说:

#define CONC(a,b) a ## b 
#define MACROA(name) CONC(A_, name) 
#define MACROB(name) CONC(B_, name)