c - #define Square(x) (x*(x))

标签 c c-preprocessor

这个问题在这里已经有了答案:




8年前关闭。




Possible Duplicate:
square of a number being defined using #define



你能解释一下为什么下面的代码输出“29”吗?
#define Square(x) (x*(x))

void main()
{
    int x = 5;
    printf("%d", Square(x+3));
}

最佳答案

由于宏只进行文本替换,你最终会得到:

x + 3 * (x + 3)

这是 29。

您绝对应该始终将宏参数放在括号之间。
#define Square(x) ((x)*(x))

更好的是,使用一个函数并信任编译器来内联它。

编辑

正如 leemes 所指出的,宏计算 x 的事实两次可能是一个问题。使用函数或更复杂的机制(例如 gcc 语句表达式)可以解决此问题。这是一个笨拙的尝试:
#define Square(x) ({    \
    typeof(x) y = (x);  \
    y*y;                \
})

关于c - #define Square(x) (x*(x)),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14662815/

相关文章:

c++ - 如何使用预处理器检查 Objective-C++ 项目中是否正在编译 cpp 文件?

c++ - c/c++ (VS2008) 将宏参数用引号引起来

c - 在 while 循环中使用 #define

c - 如何使用 C 中的函数生成随机 float 数组

c - 我如何设置 4 字节长的底部 3 个字节,同时保持顶部字节不变?

c++ - 混合使用 C(99) 和 C++ 的复数类型

c - 尝试编译时发生错误

c# - 使用 C# 预处理器添加引用

c - C预处理器语句是C语言的一部分吗?

python - 编译时如何捕获更改的 .c 文件列表?