Подтвердить что ты не робот

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

Препроцессор С++ для 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

Но препроцессор С++ удаляет пространство между "привет" и "миром":

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

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

Ответ 1

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

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