lang:cpp:preprocesseur
Ceci est une ancienne révision du document !
Utiliser les std::initializer_list (crochets) avec des macros
Le préprocesseur, comme le compilateur considère la virgule comme séparateur d'argument. Mais seul le compilateur considère les crochets ({}
) comme un groupe d'argument. Le préprocesseur va considérer une virgule à l'intérieur d'un groupe de crochets comme un changement d'argument. La solution consiste à entourer les crochets par des parenthèses : ({.., .., ..})
.
void f(std::list<std::string>) {} #define F(XXXX) f(XXXX) int main() { std::list<std::string> c; f(c); f({"1", "2", "3", "4"}); // OK. La parenthèse encadre tout l'argument de la macro. F((std::list<std::string>{"1", "2", "3", "4"})); //f((std::list<std::string>{"1", "2", "3", "4"})); // OK. La parenthèse encadre les crochets qui sont donc considérés comme un bloc. F(std::list<std::string>({"1", "2", "3", "4"})); //f(std::list<std::string>({"1", "2", "3", "4"})); // Pas OK // F({ "1", "2", "3", "4" }); // f({ "1"); // OK F(({ "1", "2", "3", "4" })); f(({ "1", "2", "3", "4" })); // Pas OK // F(std::list<std::string>{ "1", "2", "3", "4" }); // f(std::list<std::string>{ "1"); }
On voit bien que le préprocesseur respecte les parenthèses mais pas les crochets.
Passing an initialization list to a macro Archive du 21/05/2015 le 27/08/2019
lang/cpp/preprocesseur.1583519948.txt.gz · Dernière modification : 2020/03/06 19:39 de root