gpt4 book ai didi

c - 为什么在定义宏中使用括号会出错?

转载 作者:太空狗 更新时间:2023-10-29 15:56:32 24 4
gpt4 key购买 nike

#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 ')' before ';' token ”

#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;});

第一个很好。第二个是语法错误:不能用括号将多个语句括起来。这不是一回事。第三个使用名为 statement expressions 的 GCC 扩展.您可以用 ({ ... }) 包围一组语句,将其视为表达式。

请注意,在宏中包含多个语句的标准习惯用法是 do { ... } while (0) loop with no trailing semi-colon .

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

关于c - 为什么在定义宏中使用括号会出错?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55869055/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com