Puisqu'une once d'expérience vaut une tonne de théorie, j'ai essayé un petit programme de test pour 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"
};
Compilez ce fragment avec cpp -P -std=c++11 filename
pour le reproduire.
L'astuce #__VA_ARGS__
est qu'il __VA_ARGS__
ne traite pas le séparateur de virgules. Vous pouvez donc le transmettre à l'opérateur de stringizing. Les espaces de début et de fin sont supprimés, puis les espaces (y compris les retours à la ligne) entre les mots sont compressés en un seul espace. Les parenthèses doivent être équilibrées. Je pense que ces lacunes expliquent pourquoi les concepteurs de C ++ 11, malgré #__VA_ARGS__
, ont vu le besoin de littéraux de chaîne bruts.