(我正在开发一个SDK,其中我有参考特定SDK的代码,我无法追踪该程序的流程。)
什么是
#if defined (AR7x00)
意思?具体来说,这样的预处理器运算符中括号的目的是什么?
答案 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)
答案 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。
在这里我们看到不需要括号。