2009-11-28 17 views
5
#define f(g,g2) g##g2 
main() 
{ 
int var12=100; 
printf("%d",f(var,12)); 
} 

Il programma sopra stampa 100 in c concatenando var e 12. Come g ## lavoro g2 ??#define f (g, g2) g ## g2

+2

Non è un programma, è una macro. Cerca l'operatore "token-pasting" nel tuo linguaggio preferito C/C++. –

+2

@nobugz: cosa? Il precedente * è * un programma, anche se non del tutto legale C. E il programma stampa 100. C'è sicuramente una macro nel programma, ma nel dire "il programma sopra stampa 100", Shishir non si riferisce, correttamente, al intero programma e non alla macro? –

risposta

8

## solo incolla i token insieme. È una direttiva preprocessore.

E.g.

#define PASTE(a,b) a##b 

int i=PASTE(1,2); /* int i=12; */ 
0

## è il "comando" preprocessore per concatenare cosa viene prima e dopo.

0

Così, dopo pre-elaborazione che sarà simile a questa:

main() 
{ 
int var12=100; 
printf("%d",var12); 
} 
0

Questo è incollare gettone, descritto here per gcc. L'incollaggio dei token è eseguito dal preprocessore, non dal compilatore.

0

La concatenazione viene eseguita dal preprocessore perché è stato utilizzato il comando ##.

Quando non si è sicuri del comportamento del preprocessore, è possibile chiedere a gcc di fermarsi dopo aver eseguito il preprocessore. Poiché questo è prima dell'esecuzione del compilatore, l'output è abbastanza facile da capire.

Ad esempio, si supponga di avere un file pre.c

#define FOO 123 
#define CONCAT(x,y) x##y 
#define STRING(x) #x 

void main() 
{ 
    int a = FOO; 
    int b = CONCAT(123,4567); 
    char* c = STRING(IGetQuoted); 
} 

È possibile produrre l'output del preprocessore passando l'opzione -E a gcc.

$ gcc -E pre.c 
# 1 "pre.c" 
# 1 "<built-in>" 
# 1 "<command-line>" 
# 1 "pre.c" 




void main() 
{ 
    int a = 123; 
    int b = 1234567; 
    char* c = "IGetQuoted"; 
} 

Tenete a mente che #include tirerà nei contenuti del file specifica e possono rendere l'output del preprocessore piuttosto lungo.

+0

-1 (non proprio) per 'void main()'! – pmg