为什么大括号周围的括号启用预处理器宏返回值

sky*_*ire 2 c c-preprocessor

当我编写宏时,我喜欢将定义括在大括号(即{ })中,以防止可能发生的任何潜在的命名空间冲突。然而,为了从宏中获取返回值,由于某种原因宏定义也需要用括号括起来。省略周围的括号将导致不返回任何值。这是为什么?

例如

#define ADD1(x)    \
  ({int y = (x) + 1; \
    y;})

int foo = 3;
int bar = ADD1(foo);
//
// versus
//
#define ADD1_BROKEN(x) \
  {int y = (x) + 1;    \
   y;}

int baz = ADD_BROKEN(foo); // DOES NOT COMPILE
Run Code Online (Sandbox Code Playgroud)

dbu*_*ush 6

第一个宏中的表达式语句是 gcc 扩展。它允许在允许表达式的位置使用块语句,块中的最后一个语句是表达式的值。

第二种情况不起作用,因为您尝试使用块语句作为不允许的表达式。

话虽如此,您的特定示例作为简单的表达式会更好:

#define ADD1(x) ((x) + 1)
Run Code Online (Sandbox Code Playgroud)

如果你确实需要一些看起来像函数的复杂东西,那就创建一个函数。