gpt4 book ai didi

c - 宏中 "do {...} while (0)"和 "{...} ((void)0)"之间的实际区别?

转载 作者:太空狗 更新时间:2023-10-29 17:02:01 25 4
gpt4 key购买 nike

C 中的常见做法是:

#define FOO() do { /* body */ } while (0)

虽然这很好,但也可以这样做:

#define FOO() { /* body */ }((void)0)

{...}((void)0) 具有许多相同的好处:您不会意外地合并逻辑,并且 ; 是必需的行尾,所以像这样的奇怪表达式不会被忽视:FOO() else {...}

我注意到的唯一区别是这意味着您需要在 if 语句中使用大括号。

if (a)
FOO();
else
BAR();

必须写成:

if (a) {
FOO();
} else {
BAR();
}

除了这个怪癖,它似乎运作良好,可以防止 do/while 方法通常用于的同类问题。

这两种方法有什么显着差异吗?

换句话说,如果您看到使用 {...}((void)0) 的代码库,是切换到使用 的实际原因do{..}while(0),除了已经提到的一个区别之外?

最佳答案

实际差异正是您所指出的。

do { ... } while (0) 习惯用法意味着宏可以在任何需要语句的上下文中使用。

您建议的习语 { ... } ((void)0) 可以安全地用于需要表达式的大多数上下文中——但如果它是用于未加括号的 if 语句。

我想不出有什么好的理由来使用一个几乎总是有效的不熟悉的习语,而有一个总是有效的众所周知的习语。

关于c - 宏中 "do {...} while (0)"和 "{...} ((void)0)"之间的实际区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28777660/

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