当我编写宏时,我喜欢将定义括在大括号(即{ })中,以防止可能发生的任何潜在的命名空间冲突。然而,为了从宏中获取返回值,由于某种原因宏定义也需要用括号括起来。省略周围的括号将导致不返回任何值。这是为什么?
例如
#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)
第一个宏中的表达式语句是 gcc 扩展。它允许在允许表达式的位置使用块语句,块中的最后一个语句是表达式的值。
第二种情况不起作用,因为您尝试使用块语句作为不允许的表达式。
话虽如此,您的特定示例作为简单的表达式会更好:
#define ADD1(x) ((x) + 1)
Run Code Online (Sandbox Code Playgroud)
如果你确实需要一些看起来像函数的复杂东西,那就创建一个函数。
| 归档时间: |
|
| 查看次数: |
196 次 |
| 最近记录: |