2012-01-06 33 views
11

Eventuali duplicati:
# and ## in macrosordine di valutazione Macro

perché l'uscita del secondo printf è F (1,2) qual è l'ordine in cui viene valutata la macro?

#include <stdio.h> 
#define f(a,b) a##b 
#define g(a) #a 
#define h(a) g(a) 

int main() 
{ 
    printf("%s\n",h(f(1,2))); 
    printf("%s\n",g(f(1,2))); 
    return 0; 
} 

output 12 
     f(1,2) 

risposta

16

Da http://gcc.gnu.org/onlinedocs/cpp/Argument-Prescan.html#Argument-Prescan

argomenti Macro sono completamente macro-espansi prima di essere sostituiti in un corpo macro, a meno che siano stringata o incollati con altri token. Dopo la sostituzione, l'intero corpo della macro, inclusi gli argomenti sostituiti, viene nuovamente scansionato per espandere i macro. Il risultato è che gli argomenti vengono scansionati due volte per espandere le chiamate macro in essi.

ovvero:

  • f concatena argomento e quindi la sua tesi non è espansa
  • h non in stringa o concatenare argomento e quindi la sua tesi è espanso.
  • g stringifies argomento e quindi la sua tesi non è espansa

h(f(1,2)) -> g(12) -> "12"

g(f(1,2)) -> "f(1,2)"

3

non sono sicuro ordine di valutazione è un termine significativo per le macro C o C++, perché macro espansione avviene al momento della compilazione

Quanto al motivo per la seconda uscita è f(1,2) è è perché le macro sono sostituzioni testuali. Quando lo g(f(1,2)) è espanso, l'argomento di g è la sequenza di token f(1,2) e che viene rafforzata.

pensare in termini di compilatore C. Nel contesto del secondo printf si legge un token g, riconoscere che è una macro in lexing quindi espandere quella chiamata di macro. Il compilatore sta fondamentalmente facendo: se il token corrente è un nome macro, quindi espanderlo durante il lessing del codice. L'espansione delle macro avviene solo quando possibile (quindi per una macro con argomenti richiede la parentesi sinistra) e viene eseguita il prima possibile.

+0

Questo non è tecnicamente corretto. L'argomento sarebbe solo una sostituzione testuale se è concatenata o concatenata nella macro. – Pubby

+0

Non sono sicuro di capirti. 'cpp' è solo un sistema di riscrittura testuale. –

+0

Se le macro usano rigorosamente la sostituzione testuale allora 'h (f (1,2))' dovrebbe espandersi in '" f (1,2) "' – Pubby

7

Un argomento è macro-sostituita prima di essere sostituito nella lista di sostituzione, tranne dove appare come operando di # (stringize) o ## (concatenate).

Nella macro h, il parametro a non è un argomento di uno di questi due operatori, quindi l'argomento viene sostituito dalla macro e quindi sostituito nell'elenco di sostituzione. Cioè, l'argomento è f(1,2) macro sostituito diventare 1##2, e poi a 12, e poi viene sostituito in g(12), che è (ancora) macro-sostituito diventare "12".

Quando si richiama g direttamente, il parametro aè un argomento dell'operatore #, quindi il suo argomento non è macro-sostituite prima subsitution: f(1,2) viene sostituito direttamente nella lista di sostituzione, ottenendo "f(1,2)".

Problemi correlati