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
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 ... –