C编译错误:在程序中迷路'##'

时间:2012-12-18 12:53:22

标签: c

当我看到类似这样的内容时,我正在使用嵌入式内核源代码:

#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

任何人都知道出了什么问题?感谢

6 个答案:

答案 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 ..等等。