#if 定义的预处理器运算符中的括号是啥意思?

Posted

技术标签:

【中文标题】#if 定义的预处理器运算符中的括号是啥意思?【英文标题】:What do parentheses mean in an #if defined preprocessor operator?#if 定义的预处理器运算符中的括号是什么意思? 【发布时间】:2014-01-27 08:00:12 【问题描述】:

(我正在开发一个 SDK,其中我参考了特定 SDK 的代码,但我无法追踪程序的流程。)

是什么

#if defined (AR7x00)

是什么意思?具体来说,这样的预处理运算符中括号的目的是什么?

【问题讨论】:

它在AR7x00 周围添加括号。它的目的是防止疯狂。如果您不知道一对括号在 C 中的作用,请阅读 K&R。 这个问题似乎离题了,因为它没有证明对所使用的语言有任何了解。 顺便说一句,#define 不是语句,而是预处理器指令。 我认为您将其搁置有点仓促。这个问题可能格式不正确,但很明显函数defined() 是这里的主题。给它一个简单的答案,很好。无需关闭。 我想每个人都看的是标题而不是问题。 :) 这不是#define,而是#if defined()。由于defined 不是函数(它是预处理器运算符),因此不需要括号。 【参考方案1】:

这三个预处理指令:

#if defined (AR7x00)

#if defined AR7x00

#ifdef AR7x00

所有含义完全相同:只有当前定义了宏 AR7x00 时才处理以下代码。

#ifdef ... 指令只是#if defined ... 的便捷替代方案。还有一个#ifndef ... 指令; #ifndef FOO 等价于#if ! defined FOO

至于括号,defined 运算符的语法允许标识符或括号中的标识符,含义没有区别。我不完全确定为什么括号是可选的;我怀疑这只是历史性的。 (1978 年第一版 K&R 中的语言参考没有提到 defined 运算符。第二版显示了两种形式,带括号和不带括号。)

严格来说,这些不是您在普通表达式中看到的那种分组括号;它们是defined 运算符语法的一部分,只能在预处理器#if 指令中使用。特别是:

#if defined ((AR7x00))

是语法错误。

【讨论】:

感谢分享有价值的知识,但我正在尝试更改 sdk 代码以适应我的具体情况,所以当我浏览 sdk 代码时,我发现宏 AR7X00 或 (AR7X00) 的位置不存在不是这样定义的。因此,sdk 开发人员有可能甚至从头文件中隐藏这些宏定义...? @TrilokM:它可以由编译器预定义,也许通过像-DAR7X00 这样的命令行选项——或者它可能没有被定义,这就是#ifdef 测试。 谢谢。我正在工作的电源线设备包含两种芯片组,即 AR7400 和 INT6400,假设芯片组是由编译器预定义的,我应该只在编译期间提供选项 -DAR7X00 吗?因为代码在编译时出错。 您没有提到编译错误。也许你应该发布一个新问题,因为这个问题已经得到解答。 @TrilokM:您向我们展示的行不会产生该错误。 ARX700ARx700 是不同的标识符。如果您有括号以外的其他问题,您可能应该单独发布。【参考方案2】:

我认为在预处理器中使用多个条件时,括号更重要。比如下面的条件表达式

#if  defined( foo )  || defined( bar )
#error SOME PROBLEM
#endif

在我的 gnu-arm-gcc 环境中的评估与这个不同

#if defined foo || defined bar
#error SOME PROBLEM
#endif

第一个示例符合我的预期,而另一个示例似乎永远不匹配,无论标记“foo”和/或“bar”是否为#defined。

【讨论】:

【参考方案3】:

gnu.org online docs 状态,您可以使用 defined 带或不带括号。

来自MSDN entry for #if:

您还可以使用括号对符号和运算符进行分组。

括号除了将符号和运算符组合在一起以修改优先级之外没有任何作用。

【讨论】:

GNU 和微软都没有定义 C 语言。 @KeithThompson,是的,我同意,只是向他指出不同的信息来源,以便他可以获得更多详细信息。【参考方案4】:

C11,6.10.1 条件包含,5:

表单的预处理指令

# ifdef标识符换行组opt

# ifndef标识符换行组opt

检查标识符当前是否定义为宏名称。它们的条件分别相当于#if definedidentifier#if !definedidentifier

这里我们看到括号不是必需的。

【讨论】:

以上是关于#if 定义的预处理器运算符中的括号是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章

C语言的cout是啥意思?

宏编程是啥?

C语言:预处理是啥意思?就是看不懂这句话的解释!越具体越好,也可以通俗一点!

icpc(或我猜是gcc)的预处理输出中的包含路径/数字是啥意思?

Java中的花括号本身是啥意思?

C语言基础:C 预处理器预定义宏预处理器运算符(字符串常量化运算符(#),标记粘贴运算符(##),defined 运算符)参数化的宏