Препроцессор C ++ Oracle Solaris Studio 12.3 полностью удаляет пробелы при расширении __VA_ARGS__
,
Кто-нибудь может подтвердить это поведение в своей системе? Это известная ошибка компилятора? Есть ли обходные пути для этой проблемы?
Чтобы проиллюстрировать, вот простая тестовая программа, vaargs.c
:
#include <stdio.h>
#define PRINT(...) printf("%s\n", #__VA_ARGS__)
int main()
{
PRINT(hello world);
return 0;
}
Препроцессор C работает как положено:
$ cc vaargs.c -o vaargs && ./vaargs
hello world
$ cc -V
cc: Sun C 5.12 SunOS_i386 2011/11/16
Но препроцессор C ++ удаляет пробел между «hello» и «world»:
$ CC vaargs.c -o vaargs && ./vaargs
helloworld
$ CC -V
CC: Sun C++ 5.12 SunOS_i386 2011/11/16
Это ошибка компилятора, согласно N3337 16.3.2 (cpp.stringize) p2 (остальная часть цитаты отсечена):
буквенная строка это Строка литерала без префикса. Если в замене
список, параметру непосредственно предшествует#
токен предварительной обработки, оба заменены
токеном предварительной обработки одной строки символов, который содержит написание
последовательность предварительной обработки токена для соответствующего аргумента. Каждое появление пустого пространства
между токенами предварительной обработки аргумента становится одним пробелом в
буквенная символьная строка.