In base allo standard C11, un argomento di una macro simile a una funzione può contenere spazi bianchi all'inizio o alla fine della sequenza di token di pre-elaborazione. Per la sostituzione normale, questo tipo di spazi non ha effetti. Per la stringificazione, gli spazi devono essere ignorati come indicato in 6.10.3.2.2Argomenti macro del preprocessore C con spazio alla fine per concatenare?
Lo spazio bianco prima del primo token di preelaborazione e dopo l'ultimo token di preprocessing che compone l'argomento viene eliminato.
(che a mio avviso è anche una prova dimostrando che gli argomenti possono contenere spazi intorno ad esso.) E la questione è, per gli argomenti che sarebbero concatenati da ## operatori, che cosa dovrebbe fare il compilatore sui suoi spazi?
Ho provato con VC++, che sembra ignorare gli spazi.
Penso che il compilatore debba eseguire la concatenazione con spazi bianchi. Ciò può comportare un token non valido, ad esempio "ABC" formato dall'identificatore ABC e un argomento con uno spazio bianco come primo token. Secondo lo standard, se un token non valido viene formato in questo modo, il comportamento non è definito.
Quindi, per ciò che VC++ ha fatto come accennato in precedenza, è il risultato del semplice ignorare lo spazio o il risultato del comportamento non definito?
Vedo. Grazie mille per la tua risposta. Ma mi chiedo, se il compilatore non include lo spazio bianco nella sequenza di token di pre-elaborazione dell'argomento, come farà la stringa? Voglio dire, come dovrebbe sapere dove mettere lo spazio bianco tra i token di pre-elaborazione adiacenti e dove no. Immagino che non solo registri la sequenza di token ma anche informazioni sugli spazi bianchi? Cosa dice lo standard su questo? –
@WuZhenwei, hai ragione che la stringa non inserisce spazi bianchi tra i token di pre-elaborazione dove non ce n'è alcuno nella sequenza dei caratteri sorgente. Poiché al preprocessore non interessa * quanto * spazio ci sia o quali siano i caratteri dello spazio bianco specifici in tali luoghi, esso può tracciare token token se i token sono preceduti e/o seguiti da spazi bianchi. Questo è un dettaglio di implementazione. Aggiornerò la mia risposta per chiarire. –