C宏和括号中的参数使用

rub*_*buc 13 c macros parentheses c-preprocessor

#define Echo(a)  a
#define Echo(a) (a)
Run Code Online (Sandbox Code Playgroud)

我意识到这里可能没有显着差异,但为什么你想要a在宏体内包括括号内?它是如何改变它的?

cni*_*tar 14

假设你有

#define mul(x, y)  x * y
Run Code Online (Sandbox Code Playgroud)

如果我说:

mul(a + 5, 6); /* a + 5 * 6 */
Run Code Online (Sandbox Code Playgroud)

现在,如果我轻松改变宏:

#define mul(x, y)  ((x) * (y))
mul(a + 5, 6); /* ((a + 5) * (6)) */
Run Code Online (Sandbox Code Playgroud)

请记住,不会评估参数或任何内容,只会执行文本替换.

编辑

有关在括号中包含整个宏的说明,请参阅Nate CK发布的链接.

  • 假设您有一个结构体数组,并且由于某种原因您执行了“foo(bar+5)”。如果“foo”是一个函数,那就完全没问题,但如果它是一个不带括号的宏,它最终会变成“bar+5->something”。类似,如果 `bar` 是一个指向指针的指针,并且您执行 `foo(*bar)` ,最终结果为 `*bar->something` ,这肯定是错误的,您需要 `(*bar)->某事` (2认同)