当我看到类似这样的内容时,我正在使用嵌入式内核源代码:
#define OMAP_SYS_TIMER_INIT(name, clkev_nr, clkev_src, clksrc_nr, clksrc_src) \
static void __init omap##name##_timer_init(void) \
{ \
omap2_gp_clockevent_init((clkev_nr), clkev_src); \
omap2_gp_clocksource_init((clksrc_nr), clksrc_src); \
}
当我尝试制作一个程序使用这个##的东西(我不知道名字)来看看它真正能做什么我没有让它发挥作用。以下是我测试它的功能。我只是想看看##中的参数是否是文字的,但我的代码中明显缺少某些内容以便编译......
#include <stdio.h>
#include <stdlib.h>
#define DEFINE_1 2
#define DEFINE_2 4
#define DEFINE_3 6
#define DEFINE_i 9
int main(void)
{
int i;
for(i=1;i<4;i++) {
printf("numero %d = %d\n",i,DEFINE_##i##);
}
return EXIT_SUCCESS;
}
gcc的输出是:
test.c: In function ‘main’:
test.c:14:5: error: stray ‘##’ in program
test.c:14:33: error: ‘DEFINE_’ undeclared (first use in this function)
test.c:14:33: note: each undeclared identifier is reported only once for each function it appears in
test.c:14:42: error: expected ‘)’ before ‘i’
test.c:14:42: error: stray ‘##’ in program
任何人都知道出了什么问题?感谢
答案 0 :(得分:6)
它是C预处理器的token concatenation运算符。您的示例无法编译的原因是因为您未在宏(即##
语句)中使用#define
运算符。
这里有another post,其中包含更多信息。
答案 1 :(得分:2)
##
表示预处理时的连接。
http://gcc.gnu.org/onlinedocs/cpp/Concatenation.html
答案 2 :(得分:2)
您只能在预处理程序指令中使用##。
答案 3 :(得分:2)
## is used for concatenation in C preprocessor macros
在您的示例中,我们的想法是将omap与函数名称连接起来。例如
OMAP_SYS_TIMER_INIT(foo,...)
将创建一个名为omapfoo的函数。
答案 4 :(得分:2)
##
是令牌粘贴运算符,您只能在宏定义中使用它。您不能在宏定义之外使用它。
答案 5 :(得分:1)
也许你想要做的是,DEFINE_和(i = 1)将使用##连接形成“DEFINE_1”,这将是你的值为2的宏。对吗?如果是这种情况,那么问题在于,宏是预处理器,并且值将在执行之前排列。所以它寻找DEFINE_i并且没有这样的宏。在运行期间记住i = 1,2,3 ..等等。