C 将预处理器指令嵌入函数名

C 将预处理器指令嵌入函数名,c,macros,c-preprocessor,preprocessor-directive,C,Macros,C Preprocessor,Preprocessor Directive,我想在函数名中嵌入一个预处理器指令。基本上,我想制作一个宏,它以预处理器define作为参数,并连接它的定义值以获得函数名 基本上: #define PREFIX foo #define CALL(P, x) _##P_bar(x) ...then CALL(PREFIX, x) should become _foo_bar(x) 不幸的是,这会导致\u p\u bar而不是\u foo\u bar 是否有可能使其如上所述工作?C标准定义了紧跟在##运算符前面和后面的宏参数的特殊行为。在这

我想在函数名中嵌入一个预处理器指令。基本上,我想制作一个宏,它以预处理器define作为参数,并连接它的定义值以获得函数名

基本上:

#define PREFIX foo
#define CALL(P, x) _##P_bar(x)

...then 
CALL(PREFIX, x) should become _foo_bar(x)
不幸的是,这会导致
\u p\u bar
而不是
\u foo\u bar


是否有可能使其如上所述工作?

C标准定义了紧跟在##运算符前面和后面的宏参数的特殊行为。在这种情况下,它们没有完全扩展。这就是为什么您的代码没有按照预期的方式运行。若要进一步展开参数,必须以不紧跟##运算符的方式使用它。请尝试以下操作:

#define PREFIX foo
#define CALL2(P,x) _##P##_bar(x)
#define CALL(P, x) CALL2(P,x)

CALL(PREFIX, x) 

请注意,全局范围中以下划线开头的名称是为编译器和库保留的。您不应该使用这些。您确定
#定义调用(P,x)######P###u bar(x)
不起作用吗。我想问题只是识别
P
宏参数,因为下划线隐藏了它,目标是做两个串联,而不是一个。@Micheled'Amico是的。我查过了<代码>呼叫(P,x)#######(x)无效。非常感谢。这太棒了!:)