Outils pour utilisateurs

Outils du site


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