2012-12-18 8 views
5

ich mit einer eingebetteten Kernel-Quelle arbeite, wenn ich so etwas wie dies gesehen:C kompilieren Fehler: Streu ‚##‘ in Programm

#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);      \ 
} 

und wenn ich habe versucht, ein Programm zu machen, die diese ## Sache verwendet (dass ich den Namen nicht kenne) um zu sehen, was es wirklich kann Ich habe es nicht zum laufen gebracht. Unten ist, was ich getan habe, um seine Funktion zu testen. Ich will nur sehen, ob das Argument innerhalb der ##-Literal ist oder nicht, aber etwas fehlt deutlich in meinem Code für es zu kompilieren ...

#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; 
} 

Die Ausgabe von gcc ist:

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 

Wer weiß, was los ist? Danke

+1

Der Präprozessor hat keine Ahnung, was "i" ist und wie man das DEFINE_ damit verkettet - es wird nur bei und nach der Kompilierung erkannt, lange nachdem der Präprozessor seinen Job beendet hat. Sie können also keine Programmvariablen als Teile von ## concatenation ... –

Antwort

5

Es ist der token concatenation Operator für den C-Präprozessor. Der Grund dafür, dass Ihr Beispiel nicht kompiliert wird, ist, dass Sie den Operator ## nicht innerhalb eines Makros verwenden (d. H. #define).

Hier ist another post mit einigen weiteren Informationen.

2

Sie können ## nur in den Präprozessordirektiven verwenden.

1

Vielleicht, was Sie versuchen zu tun ist, wird DEFINE_ und (i = 1) verketten mit ## zu "DEFINE_1" und das wird Ihr Makro mit Wert 2 sein. Richtig? Wenn das der Fall ist, besteht das Problem darin, dass Makro ein Präprozessor ist und der Wert vor der Ausführung in ausgekleidet wird. Es sucht also nach DEFINE_i und es gibt kein solches Makro. Denken Sie daran, i = 1,2,3 .. und so weiter während der Laufzeit.

2

## ist Token einfügen Operator und Sie können es nur in einer Makrodefinition verwenden. Sie können es nicht außerhalb einer Makrodefinition verwenden.