Ho un piccolo problema con un preprocessore che mi imbarazza e non riesco a trovare alcuna spiegazione nella documentazione/preprocessore/lingua specifica.Perché il preprocessore C/C++ aggiunge uno spazio qui?
#define booboo() aaa
booboo()bbb
booboo().bbb
viene pre-elaborato in:
aaa bbb <--- why is space added here
aaa.bbb
Dopo la manipolazione trigrammi, linee e commenti continuato, preprocessore funziona su direttive del preprocessore e si divide in ingresso in token pre-elaborazione e spazi bianchi. L'elenco di sostituzione di booboo comprende un token-token che è identificativo 'aaa'. booboo() bbb è diviso in token-to-pe: 'booboo', '(', ')', 'bbb'. La sequenza di 'booboo', '(', ')' è riconosciuta come invocazione macro funzionale e dovrebbe essere estesa a 'aaa' e imho in output dovrebbe apparire come 'aaabbb'. Ho detto che sembra che - per l'umano - assomiglierebbe a un token mentre il compilatore otterrebbe 2 token 'aaa' e 'bbb' poiché non è stato utilizzato alcun operatore '##' che consente la concatenazione di token in token. Perché/quale regola rende il preprocessore cpp (c) spazio aggiuntivo tra 'aaa' e 'bbb' quando 'booboo(). Bbb' risulta in 'aaa.bbb' senza spazio?
Ciò è dovuto al fatto che cpp tenta di rendere l'output (che è per lo più umano) non ambiguo? Umano non è in grado di dire che 'aaabbb' è composto da 2 token poiché vede solo l'ortografia dei token. Ho ragione? Ho letto la documentazione C99 sul preprocessore e la documentazione di gcc per cpp. Non vedo nulla al riguardo.
Se ho ragione abbiamo situazione simile qui:
#define baba() +
baba()+
baba()-
risultati in:
+ +
+-
In caso contrario (se '++' è l'uscita) sarebbe risultato a un essere umano come ' ++ 'token ma ci sarebbero 2 token' + 'e' + '. È come con l'operatore '##' che cpp controlla se la concatenazione produce un token valido, ma nei casi mostrati vuole impedire all'uomo che tale concatenazione sia stata eseguita? '+ -' non è ambiguo quindi non viene aggiunto spazio
Vale la pena notare: lo standard C non dice nulla sugli strumenti che si fermano a metà del processo di compilazione. – o11c
Correlati (possibile dup): [espansione cpp della macro senza token-string] (http://stackoverflow.com/questions/30813619/cpp-expansion-of-macro-with-no-token-string/30813841#30813841) –
Si noti che molto spesso la spaziatura non ha importanza in C o C++. – MicroVirus