Utilisez #ifdefs et #define pour activer un appel de fonction dans un commentaire
Est-il possible de faire quelque chose comme ceci
#ifdef SOMETHING
#define foo //
#else
#define foo MyFunction
#endif
L'idée est que si quelque CHOSE est définie, puis appelle toto(...) deviennent des commentaires (ou quelque chose qui n'est pas évalué ou compilé), sinon c'est un appel à la fonction MyFunction.
J'ai vu __noop utilisé, mais je ne crois pas que je peux utiliser.
MODIFIER(s):
Je ne pense pas que je peux vraiment utiliser une macro ici, parce que Mafonction prend un nombre variable d'arguments.
Aussi, j'aimerais faire en sorte que les arguments ne sont PAS évalués! (Donc faire quelque chose comme commentant le corps de la fonction MyFunction n'a pas vraiment de me donner ce dont j'ai besoin, que les arguments seront toujours évalués)
source d'informationauteur Daniel LeCheminant
Vous devez vous connecter pour publier un commentaire.
Essayez ceci:
Si votre fonction a plusieurs arguments, puis:
Si votre fonction a un nombre variable d'arguments, alors votre compilateur peut soutenir les soi-disant "variadic macros", comme ceci:
La raison pour laquelle j'ai vu ce genre de chose utilisé dans la pratique est de se débarrasser des fonctions de journalisation à partir d'une version de construire. Cependant, voir aussi À part "debug" et "release" construit? dans lequel les gens question de savoir si vous devrait même ont différents builds.
Alternativement, au lieu de la redéfinition de la fonction d'appel en tant que rien, Jonathan commentaire pour cette réponse a suggéré de faire quelque chose comme ce qui suit:
Le raisonnement pour le faire, c'est donc que l'appel de fonction est toujours compilé (afin de ne pas être de gauche avec de gratuit erreurs comme des références à supprimé de variables), mais seulement appelé en cas de besoin: voir Kernighan & Brochet La Pratique de la Programmation et aussi la Centre de Vol spatial Goddard de la programmation des normes.
De débogage.h fichier (originaires de 1990, et n'est donc pas à l'aide de
__VA_ARGS__
):Avec C99, il n'y a plus besoin de la double parenthèses truc. Le nouveau code ne devrait pas l'utiliser à moins que C89 la compatibilité est un problème.
Peut-être un moyen plus facile de le faire serait conditionnelle, omettre le corps de la fonction?
Sauf si vous ne voulez pas d'un appel de fonction à être déployés à tous, cela semble être un moyen propre à atteindre votre objectif.
Malheureusement, l'actuelle version C++ ne prend pas en charge variadic macros.
Cependant, vous pouvez faire ceci:
Si, dans le cas où vous ne voulez pas foo appelé, vous définissez comme:
tous les appels à des foo() doit être optimisé.
Que penser de quelque chose le long de ces lignes:
Que vous pouvez l'utiliser comme cela pour le journal des messages de débogage:
Un non-générique version pour une sortie formatée avec d'autres informations de débogage à l'aide de C99 variadic les macros et les
__func__
identificateur pourrait ressembler à ceci:Voici comment vous pouvez utiliser ces macros:
Probablement, vous ne voulez pas faire de la simple "code de l'enlèvement", comme l'a suggéré,
parce que vos interlocuteurs attendent les effets secondaires de la
les arguments de se produire. Voici quelques gênants appelant les fragments de code
devrait vous faire réfléchir:
Si vous désactivez la fonction MyFunction en disant simplement:
puis les effets secondaires que les appelants étaient attend irait loin,
et leur code de casser, et être assez difficile à déboguer. J'aime
le "sizeof" suggestion ci-dessus, et j'aime aussi la suggestion à la juste
désactiver le corps de la fonction MyFunction() via #ifdef, même si cela signifie
que toutes les personnes de la même version de la fonction MyFunction(). À partir de votre
énoncé du problème, je suppose que c'est pas vraiment ce que vous voulez.
Si vous avez vraiment besoin de désactiver la fonction MyFunction() par l'intermédiaire de préprocesseur sur
par source de fichier de base, alors je ferais comme ceci:
Vous pouvez même inclure la mise en œuvre de NoOp_MyFunction() à l'intérieur de
la source & les en-têtes pour MyFunction(). Vous avez également la flexibilité
ajouter de l'exploitation forestière ou des informations de débogage dans NoOp_MyFunction()
bien.
Non, le C et le C++ Normes de dire que vous ne pouvez pas #define quelque chose pour être un commentaire, si
ne fonctionne pas.
Je suis en supposant que toto est un
printf
style de fonction? De toute façon, cela ne fonctionne pas avec un zéro paramètre de la fonction, mais si c'était le cas, vous savez déjà quoi faire. Si vous voulez vraiment être anal vous pouvez utiliser(void)sizeof
mais c'est probablement inutile.Je suis un peu réticent à publier cette réponse parce que c'est l'utilisation de la macro hackery peut devenir une source de problèmes. Toutefois - si les appels à la fonction que vous voulez avoir disparaissent sont toujours utilisé seul dans une déclaration (ie., ils ne font jamais partie d'une expression plus grande), alors quelque chose comme ce qui suit pourrait travailler (et il gère varargs):
Donc, si vous avez la ligne de code:
il se trouvera après l'étape de prétraitement comme:
ou
qui transforme la pseudo-fonction de la liste de paramètres dans un tas d'expressions séparées par l'opérateur virgule qui ne sera jamais évalué, puisque la condition renvoie toujours le
((void) 0)
résultat.Une variante de ce est quelque chose de proche de ce que ChriSW et Jonathan Leffler a suggéré:
C'est un peu différent en ce qu'il ne nécessite pas le compilateur à l'appui de variadic macros (
__VA_ARGS__
).Je pense que cela peut être utile pour éliminer les traces de débogage des appels de fonction qui sont généralement jamais réunis dans une expression plus grande, mais au-delà je pense que c'est un dangereux technique.
Note le risque de problèmes - en particulier si les paramètres dans l'appel de produire des effets secondaires (c'est un problème général avec les macros - pas seulement ce hack). Dans l'exemple, le
a++
sera évaluée uniquement siSOMETHING
est défini dans le build, sinon il ne l'est pas. Donc, si le code après l'appel dépend de la valeur dea
être incrémenté, l'un des builds a un bug.Si je me souviens bien, vous devriez être en mesure de #define votre macro pour "rien" et qui va provoquer le compilateur d'ignorer cet appel
Qu'en entourant chaque appel à la fonction myFunction avec
?