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

  • 本文关键字:程序 编译 错误 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 = %dn",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

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

它是 C 预处理器的标记串联运算符。您的示例未编译的原因是您没有在宏中使用 ## 运算符(即 #define声明)。

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

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

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

## 用于 C 预处理器宏中的串联。

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

OMAP_SYS_TIMER_INIT(呜...

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

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

也许您要做的是,DEFINE_ 和 (i=1) 将使用 ## 连接起来形成"DEFINE_1",这将是值为 2 的宏。右?如果是这种情况,问题是,宏是预处理器,值将在执行前排队。所以它寻找DEFINE_i,没有这样的宏。请记住 i=1,2,3。等等。

最新更新