8

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

#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

有谁知道出了什么问题?谢谢

4

6 回答 6

7

它是C 预处理器的标记连接运算符。您的示例无法编译的原因是您没有##在宏(即#define语句)中使用运算符。

这是另一篇包含更多信息的帖子。

于 2012-12-18T12:57:13.903 回答
2

##表示预处理时的连接。 http://gcc.gnu.org/onlinedocs/cpp/Concatenation.html

于 2012-12-18T12:56:39.443 回答
2

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

于 2012-12-18T12:56:48.130 回答
2

## 用于 C 预处理器宏中的连接

在您的示例中,想法是将 omap 与函数名称连接起来。例如

OMAP_SYS_TIMER_INIT(foo, ...)

将创建一个名为 omapfoo 的函数。

于 2012-12-18T12:57:11.020 回答
2

##是标记粘贴运算符,您只能在宏定义中使用它。您不能在宏定义之外使用它。

于 2012-12-18T13:01:40.813 回答
1

也许您要做的是, DEFINE_ 和 (i=1) 将使用 ## 连接以形成“DEFINE_1”,这将是您的值为 2 的宏。对吗?如果是这种情况,问题在于,宏是预处理器,并且值将在执行前排入行列。所以它寻找 DEFINE_i 并且没有这样的宏。在运行时记住 i=1,2,3.. 等等。

于 2012-12-18T12:59:13.593 回答