2014-10-06 25 views
11

Il preprocessore C++ di Oracle Solaris Studio 12.3 rimuove completamente gli spazi durante l'espansione __VA_ARGS__.Il preprocessore C++ rimuove gli spazi bianchi nelle chiamate a macro variadic (Solaris Studio 12.3)

Qualcuno può confermare questo comportamento sul proprio sistema? È un bug del compilatore noto? Esistono soluzioni alternative per questo problema?

Per illustrare, ecco un semplice programma di test, vaargs.c:

#include <stdio.h> 

#define PRINT(...) printf("%s\n", #__VA_ARGS__) 

int main() 
{ 
    PRINT(hello world); 

    return 0; 
} 

Il preprocessore C funziona come previsto:

$ cc vaargs.c -o vaargs && ./vaargs 
hello world 

$ cc -V 
cc: Sun C 5.12 SunOS_i386 2011/11/16 

Ma il preprocessore C++ rimuove lo spazio tra "ciao" e " world ":

$ CC vaargs.c -o vaargs && ./vaargs 
helloworld 

$ CC -V 
CC: Sun C++ 5.12 SunOS_i386 2011/11/16 
+3

Sia clang (3.5) che GCC (4.9.1) restituiscono 'ciao mondo' (per C e C++) per me. Non ho Solaris Studio, quindi non posso confermarlo. – Cornstalks

+0

Sembra essere un problema con il preprocessore di Solaris Studio 12.3 C++. Il problema non si verifica con la versione precedente (12.2). – Claudio

risposta

4

Questo è un bug del compilatore, come da N3337 16.3.2 (cpp.stringize) P2 (il resto della citazione è stato tagliato):

Una stringa carattere letterale è un stringhe letterali senza prefisso. Se, nell'elenco di sostituzione , un parametro viene immediatamente preceduto da un token di preelaborazione #, entrambi vengono sostituiti da da un token di preelaborazione letterale stringa singola che contiene l'ortografia della sequenza di token di preelaborazione per l'argomento corrispondente. Ogni occorrenza di spazio bianco tra i token di preelaborazione dell'argomento diventa un carattere a spazio singolo nel letterale stringa di caratteri .

+1

In realtà la rimozione degli spazi bianchi avviene prima del passo di stringa, nell'espansione di _ \ _ VA_ARGS _ \ _. – Claudio

+0

concordato; il testo di N3337 non è al 100% chiaro su questo. – LThode