L'aide et retourne le résultat dans C macro
Je suis en train de instrument du code de capture et d'impression des messages d'erreur. Actuellement, je suis en utilisant une macro quelque chose comme ceci:
#define my_function(x) \
switch(function(x)) { \
case ERROR: \
fprintf(stderr, "Error!\n"); \
break; \
}
Normalement, je n'ai jamais capturer la sortie de fonction et cela fonctionne bien. Mais j'ai trouvé quelques cas où j'ai aussi besoin de la valeur de retour de function()
. J'ai essayé quelque chose comme ce qui suit, mais cela produit une erreur de syntaxe.
#define my_function(x) \
do { \
int __err = function(x); \
switch(__err) { \
case ERROR: \
fprintf(stderr, "Error!\n"); \
break; \
} \
__err; \
} while(0)
Je pourrais déclarer une variable globale pour contenir la valeur de retour de la fonction, mais qui semble laid et mon programme est multithread, donc c'est probablement pour causer des problèmes. J'espère qu'il y a une meilleure solution là-bas.
- Pourquoi ne pas faire une fonction en ligne?
- La "sortie" d'une fonction n'est pas la même que la "valeur de retour" d'une fonction. Vous voulez que la valeur de retour.
- Votre post est manquant plusieurs de continuation de ligne de marqueurs. C'est peut être ton erreur de syntaxe.
Vous devez vous connecter pour publier un commentaire.
C'est relativement compliqué de code, il n'y a pas beaucoup de raisons de l'avoir dans une macro. Faire
inline
(C99) oustatic
(C89) ou les deux si vous voulez vraiment le placer dans un fichier d'en-tête. Avec toute raisonnable compilateur ensuite, cela devrait se traduire dans la même efficacité qu'une macro.FOO ## _size
de certains code généré, je suis en utilisant, par exemple). Sinon, oui, veuillez utiliser les fonctions inline.__FILE__
et__LINE__
macro pour générer de message d'erreur où l'erreur s'est réellement passé. De Plus, personnellement, je trouve les réponses de dire aux gens de ne pas faire les choses qu'ils demandent un moyen pour inutile car ils ne réponds pas vraiment à la question. Si vous répondez à une question, répondre à la question. Tous les commentaires sur la question qui devrait venir qu'après la réponse à la question ou tout simplement un commentaire.__LINE__
etc__LINE__
comme argument à la fonction inline, ce qui résulte en un peu laid code à mon humble avis.__LINE__
,__FILE__
ou__func__
. Ce serait complètement portable, de type sécuritaire et efficace. Et s'il vous plaît tous les gars de vote de cela, revenir à la question qui est traitée ici. Il n'y a rien sur ces macros dans la question.GCC dispose d'une fonction appelée déclaration des expressions
Donc si définir la macro comme
que vous pourrez utiliser comme comme
Un très retard de réponse. Mais n'en est pas moins. Je suis d'accord fonctions inline sont mieux, mais les MACROs offrent une jolie impression de plaisir que vous ne pouvez pas obtenir avec les fonctions inline. Je suis d'accord avec @qrdl que vous pouvez en effet utiliser déclaration expressions vous avait restructuré vos déclarations un peu. Voici comment cela pourrait fonctionner avec une macro -
({ ... })
travailler dans n'importe quel compilateur ? est une distribution GNU C extension gcc.gnu.org/onlinedocs/gcc/Statement-Exprs.htmlDésolé, c'est un montage...
Comme suit:
À préserver le passage par référence en C paradigme, vous devriez appeler my_function de cette façon:
De cette façon, plus tard, si vous décidez de faire my_function une fonction réelle, vous n'avez pas besoin de modifier l'appel des références.
Btw, qrdl de la "Déclaration des Expressions" est aussi une bonne façon de le faire.
il n'est pas nécessaire de déclarer la variable si votre fonction retourne quelque chose, alors vous pouvez obtenir directement cette valeur. Par exemple:
Ici faire_quelque_chose certains retours entier. Ensuite, vous pouvez facilement l'utiliser comme:
do_something
et le seul moyen de prendre l'approche que vous êtes suggère, c'est d'appelerdo_something
deux fois.