C编译错误:程序中有杂散的'##'。

10

当我正在处理嵌入式内核源码时,我看到了这样的内容:

#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

有人知道出了什么问题吗?谢谢

1
预处理器不知道 i 是什么,也不知道如何与 DEFINE_ 进行连接。它只会在编译时及之后才被识别,远在预处理器完成工作之后。因此,您不能将程序变量用作 ## 连接的一部分... - SF.
6个回答

7
这是C预处理器中的令牌连接运算符。你的示例无法编译的原因是因为你没有在宏(即#define语句)中使用##运算符。
这里有另一篇文章提供更多信息。

2

2
您只能在预处理器指令中使用 ##。

2

2

## 是一个标记粘贴操作符,只能在宏定义中使用。你不能在宏定义之外使用它。


1
也许你想做的是,使用##将DEFINE_和(i=1)连接起来形成"DEFINE_1",这将是你的宏,其值为2。对吗?如果是这样,问题在于,宏是预处理器,在执行之前会被内联获取值。因此,它会寻找DEFINE_i,但没有这样的宏。记住,在运行时i=1,2,3...等等。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接