2009-06-11 13 views
1

Pourquoi cela ne compile sur VC 2005?Passant fonction multi-param dans une macro

bool isTrue(bool, bool) { return true; } 

void foo(); 

#define DO_IF(condition, ...) if (condition) foo(__VA_ARGS__);   

void run() 
{ 
    DO_IF(isTrue(true, true)); // error C2143: syntax error : missing ')' before 'constant' 
} 

En l'utilisant les sorties seul préprocesseur:

bool isTrue(bool, bool) { return true; } 

void foo(); 



void run() 
{ 
    if (isTrue(true true)) foo();; 
} 

Notez la virgule manquante dans la ligne avant-dernier.

Dernière édition:

LOL!

bool isTrue(bool, bool) { return true; } 

void foo(); 

#define DO_IF(condition, ...) if (condition) { foo(__VA_ARGS__); } 

void run() 
{ 
    DO_IF(isTrue(true ,, true)); // ROTFL - This Compiles :) 
} 
+0

Doit être bug préprocesseur. CPP ne devrait pas jouer avec le paramètre macro. – qrdl

+1

Cela ressemble à un bogue de préprocesseur. D'ici: http: //msdn.microsoft.com/en-us/library/ms177415 (VS.80) .aspx "La norme C spécifie qu'au moins un argument doit être passé à l'ellipse, à assurez-vous que la macro ne se résout pas en une expression avec une virgule de fin. " Par conséquent, au lieu d'émettre une erreur, l'entrée est affectée (vrai vrai). –

+1

Microsoft est incorrect. Pour manger une virgule flottante, il suffit d'utiliser ## __ VAR_ARGS__, donc vous ne pouvez pas fournir de params, du moins selon les documents du GCC: http://gcc.gnu.org/onlinedocs/cpp/Variadic-Macros.html – qrdl

Répondre

3

macros avec un nombre indéfini d'arguments n'existent pas dans la norme C 1990 ou la norme actuelle de C++. Je pense qu'ils ont été introduits dans la norme C 1999, et les implémentations ont été plutôt lentes à adopter les changements de cette norme. Ils seront dans le prochain standard C++ (qui devrait sortir l'année prochaine). Je n'ai pas pris la peine de suivre la conformité C99 dans Visual Studio, principalement parce que les seules choses pour lesquelles j'utilise C nécessitent une portabilité extrême, et je ne peux pas encore l'obtenir avec C99. Cependant, il est fort probable que VS 2005 manquait de pièces de C99 que VS2008.

Alternativement, il se pourrait que vous compilez le programme C++. Vérifiez les propriétés du compilateur.

+0

Les macros variadiques sont prises en charge dans VC2005. Bien que, semble-t-il, avec quelques bogues d'implémentation. –

0

Votre code compile très bien dans VS2008, si je change DO_IF à RETURN_IF. Cependant, cela ne devrait rien changer à votre erreur.

Edit: compile toujours sans erreur, même après vos modifications.

0

Je pense qu'il faut travailler, sauf, devrait-il pas ...

RETURN_IF(isTrue(b, !b)); 

et

RETURN_IF(isTrue(b, b)); 
+0

C'est un exemple de jouet, peu importe ce que b est (regardez la fonction) – Dolphin

+0

Euh ... OK? Il avait DO_IF et je l'ai remplacé par RETURN_IF dans ma réponse. Bien sûr b n'a pas d'importance! :) –

1

exécuter votre code par RPC (C préprocesseur) pour voir ce que les substitutions du RPC ne pour votre macro.

Vous pouvez le faire en appelant cpp ou en fournissant le paramètre -E au compilateur (si vous utilisez gcc, bien sûr).

+0

+1 Très probablement, il existe une autre macro qui gâche cette macro. – Dolphin

1

Diverses implémentations préprocesseur parse les virgules goulûment, en les traitant comme des séparateurs pour les arguments macro. Ainsi, CPP pense que vous demandez à "DO_IF" de faire une substitution avec deux paramètres, "isTrue (true" et "true)".

Questions connexes