为什么在define宏中使用括号会导致错误?

用户名
#define swap(a,b) a = a ^ b; b = a ^ b; a = a ^ b;
int main()
{
    swap(a,b)
}

给出正确答案。

#define swap(a,b) (a = a ^ b; b = a ^ b; a = a ^ b;)
int main()
{
    swap(a,b)
}

给出编译错误:“;”之前的“ expected')' 令牌”

#define swap(a,b) ({a = a ^ b; b = a ^ b; a = a ^ b;})
int main()
{
    swap(a,b); //note the semicolon at the end, without that the compiler gives an error
}

工作正常。

现在我的困惑是为什么第二个不起作用?我认为它应该工作完美。其次,为什么我需要在第三个宏调用的末尾添加分号?

约翰·库格曼

如果将宏扩展出来,它们三个看起来像这样:

a = a ^ b; b = a ^ b; a = a ^ b;
(a = a ^ b; b = a ^ b; a = a ^ b;)
({a = a ^ b; b = a ^ b; a = a ^ b;});

第一个很好。第二个是语法错误:您不能用括号将多个语句括起来。没关系 第三种使用GCC扩展,称为语句表达式您可以将一组语句括起来({ ... })以将其视为表达式。

请注意,在宏中具有多个语句的标准惯用法是do { ... } while (0)没有尾随分号循环

#define swap(a,b) do { a = a ^ b; b = a ^ b; a = a ^ b; } while (0)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么在我的代码中使用宏会产生错误?

为什么在默认构造函数中使用括号会导致变量的创建?

为什么“中性”括号会导致R(或tidyverse)错误?

为什么在 C 中使用 round() 而不是 floor() 可能会导致错误/(程序错误)?

为什么在“ gam(y〜mgcv :: s ...)”中使用“ mgcv :: s”会导致错误?

为什么在循环条件中使用 '<=' 而不是 '<' 会导致分段错误 [SIGSEGV]?

为什么会导致错误?

为什么在三元运算符中使用赋值会产生没有括号的错误?

JavaScript-为什么包含括号会导致三元表达式错误?

为什么在此表达式中用括号替换美元符号($)会导致错误?

为什么不使用unwrap()会导致错误?

为什么使用char **会导致char *工作的段错误?

为什么使用Viewbag渲染数据会导致错误?

为什么C宏调用会吃掉花括号?

为什么在Spark Shell中使用自定义案例类会导致序列化错误?

为什么这个条件会导致错误?

为什么矢量会导致细分错误?

为什么以下会导致分段错误?

为什么括号会导致对象变得未绑定?

在什么情况下此宏会导致错误?

为什么在Dafny函数中使用new会产生错误?

为什么在此代码中使用>会产生错误?

为什么在SQL中使用别名会返回错误?

为什么在\ mintinline {} {}中的乳胶中使用#会返回错误?

为什么在Julia中使用宏?

为什么这些连续的宏替换不会导致错误?

为什么要对宏定义中的单个值使用括号?

SQL 错误为什么我会“缺少右括号”?

为什么在同一goroutine中使用未缓冲的通道会导致死锁?