Препроцессор C++ удаляет пробелы в вызовах переменных макросов (Solaris Studio 12.3)

Препроцессор 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

1 ответ

Это ошибка компилятора, согласно N3337 16.3.2 (cpp.stringize) p2 (остальная часть цитаты пропущена):

Символьный строковый литерал - это строковый литерал без префикса. Если в списке замены параметру сразу предшествует # маркер предварительной обработки, оба заменяются литералом токена предварительной обработки, состоящим из одной символьной строки, который содержит написание последовательности токена предварительной обработки для соответствующего аргумента. Каждое вхождение пробела между токенами предварительной обработки аргумента становится одним пробелом в символьном строковом литерале.

Другие вопросы по тегам