2012-12-18 42 views
5

我與嵌入式內核源代碼的工作,當我看到這樣的事情: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);      \ 
} 

,當我tryed做的是用這個東西##計劃(我不知道這個名字),看看它可以做什麼,我沒有得到它的工作。以下是我所做的測試它的功能。我只是想看看,如果裏面##的說法是文字還是沒有的事,但在我爲它編寫代碼顯然缺少...

#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_ - 只有在編譯之後和編譯之後,預處理器完成其工作後纔會識別它。所以你不能使用程序變量作爲##連接塊...... –

回答

5

這是C預處理器的token concatenation運算符。您的示例未編譯的原因是因爲您沒有在宏中使用##運算符(即#define語句)。

以下是another post的一些更多信息。

2

您只能在預處理指令中使用##。

1

也許你想要做的是,DEFINE_和(i = 1)將使用##連接形成「DEFINE_1」,這將是你的宏值爲2。如果是這樣的話,問題在於,宏是預處理器,並且在執行之前,值將被排隊。所以它尋找DEFINE_i並且沒有這樣的宏。記住i = 1,2,3 ..等等。

2

##是令牌粘貼操作符,您只能在宏定義中使用它。你不能在宏定義之外使用它。