括号在#if定义的预处理程序运算符中的含义是什么?

时间:2014-01-27 08:00:12

标签: c c-preprocessor preprocessor-directive

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

什么是

#if defined (AR7x00)

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

4 个答案:

答案 0 :(得分:7)

这三个预处理器指令:

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

是语法错误。

答案 1 :(得分:2)

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

来自MSDN entry for #if

  

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

除了组符号和运算符之外,括号不会执行任何操作来修改优先级。

答案 2 :(得分:2)

我认为在预处理器中使用多个条件时,parantheses更重要。例如,以下条件表达式

#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 :(得分:0)

C11,6.10.1 条件包含,5:

<块引用>

表单的预处理指令

# ifdef 标识符换行组opt

# ifndef 标识符换行组opt

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

在这里我们看到不需要括号。