C预处理器和操作顺序

jho*_*hon 9 c c++ macros c-preprocessor

我正在学习C,但我不明白这一点:

#define square(x) x*x
a = square(2+3) //a = 11
Run Code Online (Sandbox Code Playgroud)

当这个运行时,为什么a最终会出现11

Fre*_*son 21

它扩展到2+3*2+3,相当于2+(3*2)+3.使用括号来修复它:

#define square(x) ((x)*(x))
Run Code Online (Sandbox Code Playgroud)

现在尝试一下,square(x++)你会遇到更多的问题(未定义的行为).如果可以,请避免将其作为宏.

  • 等效的c ++函数应该和宏一样高效(在现有的优化编译器上)并且不会遇到这个问题. (3认同)
  • @Martin:如果OP正在使用C++,请更正.指示它可能是C.我认为C99也有内联函数,它似乎是GNU C的扩展.http://en.wikipedia.org/wiki/Inline_function#Language_support (2认同)

Pra*_*rav 12

square(2+3)扩展到2+3*2+3相当于2+(3*2)+3[ *具有更高的优先级+]

在gcc上,您可以使用-E选项查看预处理器生成的内容

C:\Users\SUPER USER>type a.c
#define square(x) x*x

int main()
{
   a = square(2+3); //a = 11
}

C:\Users\SUPER USER>gcc -E a.c
# 1 "a.c"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "a.c"


int main()
{
   a = 2+3*2+3;
}
Run Code Online (Sandbox Code Playgroud)

补救

试试这个

#define square(x) ((x)*(x))
Run Code Online (Sandbox Code Playgroud)