Je veux écrire une macro en C qui accepte n'importe quel nombre de paramètres, pas un nombre spécifique
exemple:
#define macro( X ) something_complicated( whatever( X ) )
où X
est un nombre quelconque de paramètres
J'en ai besoin car il whatever
est surchargé et peut être appelé avec 2 ou 4 paramètres.
J'ai essayé de définir la macro deux fois, mais la deuxième définition a remplacé la première!
Le compilateur avec lequel je travaille est g ++ (plus spécifiquement, mingw)
c
g++
c-preprocessor
variadic
hasen
la source
la source
Réponses:
C99, également pris en charge par le compilateur VC ++.
la source
##
n'est pas nécessaire et n'est pas portable.#define FOO(...) printf(__VA_ARGS__)
fait le travail de manière portable; lefmt
paramètre peut être omis de la définition.__VA_ARGS__
est la façon standard de le faire. N'utilisez pas de hacks spécifiques au compilateur si vous n'en avez pas besoin.Je suis vraiment ennuyé de ne pas pouvoir commenter le message d'origine. Dans tous les cas, C ++ n'est pas un surensemble de C. Il est vraiment idiot de compiler votre code C avec un compilateur C ++. Ne fais pas ce que Donny ne fait pas.
la source
class
parklass
pour permettre la compilation avec un compilateur C ++. Notez également qu'il existe certaines différences qui vous feront trébucher; par exemple, l'opérateur ternaire n'est pas évalué de la même manière dans les deux langues, et leinline
mot - clé signifie quelque chose de complètement différent (comme je l'ai appris d'une question différente).Je ne pense pas que ce soit possible, vous pouvez le simuler avec des doubles parenthèses ... tant que vous n'avez pas besoin des arguments individuellement.
la source
Si le compilateur ne comprend pas les macros variadiques, vous pouvez également supprimer PRINT avec l'une des options suivantes:
ou
Le premier commente les instructions PRINT, le second empêche l'instruction PRINT en raison d'une condition NULL if. Si l'optimisation est définie, le compilateur doit supprimer les instructions jamais exécutées comme: if (0) print ("hello world"); ou ((nul) 0);
la source
if
version appropriée de «ne pas faire cela» qui prend en compte la structure du code est la suivante:if (0) { your_code } else
un point-virgule après la fin de l'expansion de votre macroelse
. Lawhile
version ressemble à:while(0) { your_code }
Le problème avec lado..while
version est que le codedo { your_code } while (0)
est fait une fois, c'est garanti. Dans les trois cas, siyour_code
est vide, c'est un bondo nothing gracefully
.expliqué pour g ++ ici, bien qu'il fasse partie de C99 donc devrait fonctionner pour tout le monde
http://www.delorie.com/gnu/docs/gcc/gcc_44.html
exemple rapide:
la source
__VA_ARGS__
, bien qu'il soit également pris en charge par les compilateurs dans les versions antérieures, en tant qu'extension.