2014-10-06 29 views
11

Procesor C++ Oracle Solaris Studio 12.3 całkowicie usuwa spacje podczas rozwijania __VA_ARGS__.Preprocesor C++ usuwa białe znaki w wywołaniach makr warstwowych (Solaris Studio 12.3)

Czy ktoś może potwierdzić to zachowanie w swoim systemie? Czy jest to znany błąd kompilatora? Czy są jakieś obejścia tego problemu?

Aby zilustrować, oto prosty program testowy, vaargs.c:

#include <stdio.h> 

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

int main() 
{ 
    PRINT(hello world); 

    return 0; 
} 

C preprocesor działa zgodnie z oczekiwaniami:

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

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

Ale C++ preprocesora usuwa przestrzeń pomiędzy "hello" i " świat ":

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

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

Zarówno clang (3.5), jak i GCC (4.9.1) wyświetlają dla mnie "cześć świat" (dla C i C++). Nie mam Solaris Studio, więc nie mogę tego potwierdzić. – Cornstalks

+0

Wygląda na to, że problem dotyczy preprocesora Solaris Studio 12.3 C++. Problem nie występuje w poprzedniej wersji (12.2). – Claudio

Odpowiedz

4

To jest błąd kompilatora, zgodnie z N3337 16.3.2 (cpp.stringize) p2 (reszta cytatu jest ucięte):

Ciąg charakter dosłowny jest string-dosłowny bez prefiksu. Jeśli na liście zamiennej wymieniony parametr jest bezpośrednio poprzedzany tokenem przetwarzania wstępnego #, oba są zastępowane za pomocą tokenu przetwarzania wstępnego z pojedynczym ciągiem znaków, który zawiera pisownię wstępnej tokenu przetwarzania wstępnego dla odpowiedniego argumentu. Każde wystąpienie białego odstępu między argumentami przetwarzania wstępnego argumentu staje się pojedynczym znakiem spacji w literałowym ciągu literowym znaków.

+1

W rzeczywistości usuwanie białych znaków następuje przed krokiem stringize, w rozszerzeniu _ \ _ VA_ARGS _ \ _. – Claudio

+0

Uzgodnione; tekst N3337 nie jest w 100% jasny na ten temat. – LThode

Powiązane problemy