web-dev-qa-db-fra.com

Les macros Variadic sont-elles non standard?

Pour les bâtiments de débogage, j'utilise généralement Clang, car il permet de mieux formater les avertissements et les erreurs, et facilite un peu leur traçage et leur correction.

Mais récemment, après avoir ajouté une macro avec des arguments variadiques, Clang m'a dit ce qui suit (à partir d'un projet factice):

main.cpp:5:20: warning: named variadic macros are a GNU extension [-Wvariadic-macros]
#define stuff3(args...)  stuff_i(args)

Je sais que macroname(args...) compile parfaitement dans un large éventail de compilateurs, notamment Visualstudio, Sunstudio et bien sûr GCC. Mais juste pour m'assurer que ce son est correct, j'ai essayé deux autres moyens d'élargir les arguments variadiques:

Numéro 1:

#define stuff1(...)  stuff_i(...)

Numéro 2:

#define stuff2(...)  stuff_i(__VA_ARGS__)

Sur les deux je reçois ce message:

main.cpp:3:16: warning: variadic macros were introduced in C99 [-Wvariadic-macros]

... Ce qui me fait me demander si les macros Variadic font réellement partie du standard C++ (et bien sûr, je sais que le préprocesseur est interprété indépendamment).

33
user350814

Citation Wikipedia :

Les macros à arguments variables ont été introduites en 1999 dans la révision ISO/IEC 9899: 1999 (C99) de la norme de langage C et en 2011 dans la révision ISO/IEC 14882: 2011 (C++ 11) de la norme de langage C++.

C'est donc standard à partir de C99 et C++ 11, mais une extension GNU en C++ 03.

39
Thomas

À partir de C++ 11, les macros variadiques sont maintenant incluses dans C++ standard. La section 16.3 de la norme C++ 11 spécifie les macros variadiques telles qu'elles soient compatibles avec les macros variadiques de C99 (la seconde forme de la question).

Voici un exemple de définition de macro variadique conforme aux normes en C++:

#define foo(x, y, ...)    bar(x, y, __VA_ARGS__)
28
Dan Moulding

Sous la forme de votre exemple "Number 2", ils sont standard en C99 et généralement, le préprocesseur d'un compilateur C++ est identique pour la compilation C et C++.

Ils sont également pris en charge par Microsoft VC++ en dépit de sa résistance par ailleurs têtue à la conformité C99. Donc, entre cela et GCC, il y a peu de raisons d'éviter de les utiliser. Même sur la plupart des compilateurs de systèmes intégrés que j'utilise, ils sont pris en charge.

Évitez toutefois la forme «Numéro 1», qui est résolument spécifique à GCC et sans aucun doute déconseillée.

4
Clifford

Standard dit dans 16.3 Remplacement de la macro :

L'identificateur _ _ VA_ARGS _ _ apparaît uniquement dans la liste de remplacement d'une macro de type fonction utilisant la notation Ellipsis dans les paramètres.

0
Sebastian Mach