Поскольку унция опыта стоит тонны теории, я попробовал небольшую тестовую программу для MULTILINE
:
#define MULTILINE(...) #__VA_ARGS__
const char *mstr[] =
{
MULTILINE(1, 2, 3), // "1, 2, 3"
MULTILINE(1,2,3), // "1,2,3"
MULTILINE(1 , 2 , 3), // "1 , 2 , 3"
MULTILINE( 1 , 2 , 3 ), // "1 , 2 , 3"
MULTILINE((1, 2, 3)), // "(1, 2, 3)"
MULTILINE(1
2
3), // "1 2 3"
MULTILINE(1\n2\n3\n), // "1\n2\n3\n"
MULTILINE(1\n
2\n
3\n), // "1\n 2\n 3\n"
MULTILINE(1, "2" \3) // "1, \"2\" \3"
};
Скомпилируйте этот фрагмент с cpp -P -std=c++11 filename
для воспроизведения.
Хитрость #__VA_ARGS__
в том, что __VA_ARGS__
не обрабатывает разделитель запятых. Таким образом, вы можете передать его оператору строки. Начальные и конечные пробелы обрезаются, а пробелы (включая переводы строк) между словами сжимаются в один пробел. Круглые скобки должны быть сбалансированы. Я думаю, что эти недостатки объясняют, почему разработчики C ++ 11, несмотря на #__VA_ARGS__
, увидели необходимость в необработанных строковых литералах.