#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
#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
##
solo incolla i token insieme. È una direttiva preprocessore.
E.g.
#define PASTE(a,b) a##b
int i=PASTE(1,2); /* int i=12; */
##
è il "comando" preprocessore per concatenare cosa viene prima e dopo.
Così, dopo pre-elaborazione che sarà simile a questa:
main()
{
int var12=100;
printf("%d",var12);
}
Questo è incollare gettone, descritto here per gcc. L'incollaggio dei token è eseguito dal preprocessore, non dal compilatore.
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.
-1 (non proprio) per 'void main()'! – pmg
Non è un programma, è una macro. Cerca l'operatore "token-pasting" nel tuo linguaggio preferito C/C++. –
@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? –