在 C 中定义类似函数的宏时,使用 {} 对或 () 对有什么区别吗?

发布于 2024-08-30 02:57:17 字数 162 浏览 2 评论 0原文

例如:

#define FOO(x)     (printf(x))

#define FOO(x)     {printf(x)}

似乎两者都可以用于预处理,但哪个更好?

For example:

#define FOO(x)     (printf(x))

and

#define FOO(x)     {printf(x)}

It seems that both are viable for preprocessing, but which is better?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

泪是无色的血 2024-09-06 02:57:17

如果您将宏视为表达式,请使用 () 形式。

如果您将其视为命令(并且从不作为表达式),则使用 {} 形式。或者更确切地说,使用 do{}while(0) 形式,因为当在 if 等关键字附近使用时,替换风险更少:

#define FOO(x) do {    \
    printf(x);         \
} while(0)

If you're treating the macro as an expression, use the () form.

If you're treating it as a command (and never as an expression) then use the {} form. Or rather, use the do{}while(0) form as that has fewer substitution hazards when used near keywords like if:

#define FOO(x) do {    \
    printf(x);         \
} while(0)
悲喜皆因你 2024-09-06 02:57:17

括号 () 用于强制执行正确的计算,无论运算符优先级如何,这样您在宏扩展时就不会产生任何令人讨厌的副作用。

大括号 {} 用于使宏成为 C 块语句,尽管执行此操作的规范方法是:

#define FOO(x) \
  do { \
    ... stuff ... \
  } while (0)

请注意,gcc 提供了对 C 语言的扩展,使得可以从block - 如果该块用作表达式的一部分,则最后计算的表达式将是返回的值。

Parentheses () are used to enforce correct evaluation regardless of operator precedence, so that you hopefully won't get any nasty side effects when the macro is expanded.

Braces {} are used to make the macro a C block statement, although the canonical way to do this is:

#define FOO(x) \
  do { \
    ... stuff ... \
  } while (0)

Note that gcc provides an extension to the C language which makes it possible to return a value from a block - the last expression evaluated will be the value returned if the block is used as part of an expression.

九命猫 2024-09-06 02:57:17

在宏中使用括号的目的是在宏扩展时控制优先级。考虑一下:

#define X( a, b ) a * b

如果像这样使用宏,

X( 1 + 2, 3 )

我们可能希望答案为 9,但是我们展开后得到的是:

1 + 2 * 3

给我们 7。为了避免这种情况,我们应该将宏编写为:

#define X( a, b ) ((a) * (b))

如果优先级不是一个问题,任何一种类型的括号都不是绝对必需的,尽管根据 ,macros 语义可能需要大括号 - 例如,如果您想创建一个局部变量,

The purpose of using parens in a macro is to control precedence when the macro is expanded. Consider:

#define X( a, b ) a * b

if the macro is used like this

X( 1 + 2, 3 )

we would presumably like the answer to be 9, but what we get on expansion is:

1 + 2 * 3

giving us 7. To avoid this kind of thing, we should have written the macro as:

#define X( a, b ) ((a) * (b))

If precedence is not an issue, brackets either type are not absolutely required, though braces may be needed depending on the ,macros semantics - if for example you want to create a local variable,

可遇━不可求 2024-09-06 02:57:17

如果您需要在表达式中使用 FOO(x),则不能使用 {} 形式。例如:

result = FOO(some_variable);

if (FOO(some_variable))

If you will ever need FOO(x) inside an expression, then you cannot use the {} form. For example:

result = FOO(some_variable);

or

if (FOO(some_variable))
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文