2010-07-21 24 views
1

Est-il possible d'appeler des macros fonctionnelles avec moins de tous les paramètres dans Linux? En fait, cela ne génère qu'un avertissement dans Visual Studio (avertissement 4003) et les variables non affectées sont remplacées par "". Mais compiler en utilisant g ++ génère une erreur dans linux ("error: macro *** requires ** arguments, mais seulement ** given").Appeler une macro C++ avec moins d'arguments

Y a-t-il un moyen de le désactiver ou de le contourner?

+9

Si vous utilisez C++, vous devez utiliser des fonctions en ligne au lieu de macros. En fait, en C++, évitez autant que possible d'utiliser le préprocesseur. – Dima

+0

Oui ... si vous les utilisez pour autre chose que des gardes, vous êtes un macrobateur. ;-) –

+2

Il existe encore quelques situations en C++ où les directives de préprocesseur et/ou les macros sont la seule réponse, par exemple le code de retour qui devrait être inclus dans les versions de débogage mais pas du tout dans les versions de release. Mais oui, en général, ils devraient être évités. –

Répondre

2

Le nombre d'arguments dans un appel de macro doit correspondre exactement au nombre de paramètres dans la définition de macro. Donc, non, vous ne pouvez pas invoquer une macro avec moins d'arguments que de paramètres. Pour le "surmonter", vous pouvez définir plusieurs macros différemment nommées avec des nombres de paramètres différents. C++ 0x (qui n'est pas encore standard, mais que votre compilateur pourrait partiellement supporter) ajoute le support pour les macros variadiques qui peuvent être appelées avec un nombre variable d'arguments.

+0

GCC prend en charge les macros variées depuis longtemps. Je ne sais pas s'ils fonctionnent de la même manière qu'en C++ 0x. Il devrait leur donner un essai http://gcc.gnu.org/onlinedocs/gcc/Variadic-Macros.html Ici, il est dit que les macros variées proviennent de C99. Ne devraient-ils pas être en C++ aussi? – asr

+0

@asr: Des macros variadiques ont été ajoutées à C dans C99 (en 1999); la norme C++ actuelle a été approuvée en 1998 et n'a pas de macros variadiques. Ils ont été ajoutés au prochain C++ 0x. gcc peut les prendre en charge lors de la compilation du code C++, mais si c'est le cas, il s'agit d'une extension de langage ou d'un support préemptif pour C++ 0x. –

2

La norme (§16.3 - remplacement Macro) est clair que vous devez passer le même nombre d'arguments:

"If the identifier-list in the macro definition does not end with an ellipsis, the number of arguments (including those arguments consisting of no preprocessing tokens) in an invocation of a function-like macro shall equal the number of parameters in the macro definition."

Je ne sais pas d'une option g ++ pour remplacer ce.