J'apprends C, mais je ne comprends pas ceci:
#define square(x) x*x a = square(2+3) //a = 11
5 Réponses :
Il se développe à essayez maintenant avec 2 + 3 * 2 + 3 code>, ce qui est équivalent à
2+ (3 * 2) +3 code>. Utilisez des parenthèses pour le réparer:
carré (x ++) code> et vous rencontrerez plus de problèmes (comportement non défini). Évitez de faire cela comme une macro si vous le pouvez. P> p>
La fonction équivalente C ++ doit être aussi efficace qu'une macro (sur des compilateurs modernes avec des optimisations devenant) et ne souffrira pas de ce problème.
@Martin: Correct, si l'op utilise c ++. Les indications sont-elles probablement C. Je pense que C99 a également des fonctions en ligne, et il apparaît qu'ils sont une extension de GNU C. EN.Wikipedia.org/wiki/Inline_function#Language_support
sur gcc, vous pouvez utiliser l'option remède p> ESSAYEZ CE P> carré (2 + 3) code> se développe à
2 + 3 * 2 + 3 code> équivalent à
2+ (3 * 2) +3 code> [
* code> a une priorité supérieure à celle
+ code>]
--e code> pour voir ce que votre prétraiteur génère p>
#define square(x) ((x)*(x))
+1 Pour non seulement trouver le problème, mais également enseigner l'OP (et le reste de nous) Comment déboguer de tels problèmes.
car toujours enterrer des arguments macro et toute l'expression entre parenthèses pour éviter ceci: p> Notez également que toute expression que vous passez sera évaluée deux fois, ce qui peut être indésirable si l'expression a un effet secondaire tel qu'une affectation ou un appel de fonction. Dans ces cas, il est préférable d'utiliser une fonction en ligne. P> p> 2 + 3 code> est substitué littéralement dans l'expression
x * x code>, il devient
2 + 3 * 2 + 3 code>, et le
* code> L'opérateur a une priorité plus élevée afin que vous n'obtiens pas au résultat attendu.
Toujours enterrer des macros entre parenthèses aussi. Avec votre suggestion, 1.0 / carré (x) code> serait alors évalué à
1.0 / (2 + 3) * (2 + 3) code>, donc
1.0 Code> au lieu de
0,04 code>.
@Sam: Point pris. Ironique, mais j'ai moi-même dit que quelques mois il y a quelques mois dans cette réponse: Stackoverflow.com/Questions/4455307/...
Essayez:
#define square(x) ((x)*(x))
Pensez à ce que vous obtenez lorsque la macro est élargie. Le préprocesseur C étendra ceci comme vous devez définir correctement votre macro. Encourrez toujours la variable macro entre parenthèses. Cela vous donnerait le résultat attendu. P> a = ((2 + 3) * (2 + 3))
Votre conseil n'est pas «définissant correctement» la macro. 1.0 / carré (x) code> serait évalué à
1.0 / (2 + 3) * (2 + 3) code>, donc
1.0 code> au lieu de < Code> 0.04 code>.
J'ai corrigé la macro mal définie. A ajouté un autre ensemble de parenthèses entourant.
Juste comme un conseil, cet exemple montre l'une des nombreuses raisons pour lesquelles vous devriez éviter d'utiliser des macros en C jusqu'au jour où vous êtes là où vous Vraiment B> Sachez ce que vous faites. Bien sûr, quand ce jour-là vient, vous saurez pourquoi les éviter en détail ...
@ T.E.D.: Macros (et le préprocesseur en général) sont un outil comme n'importe quel autre. Cet exemple ne montre pas pourquoi vous ne devez pas utiliser de macros en général - il montre simplement une affaire d'utilisation particulière pour laquelle il est inapproprié de les appliquer. Il y a à la fois de bonnes et de mauvaises utilisations des macros.
Cela dit, il y a bien sûr plus de mauvaises utilisations que de bonnes :)
Nommez mieux la question de la question