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

Tri*_*k M 4 c c-preprocessor preprocessor-directive

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

是什么

#if defined (AR7x00)
Run Code Online (Sandbox Code Playgroud)

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

Kei*_*son 7

这三个预处理器指令:

#if defined (AR7x00)

#if defined AR7x00

#ifdef AR7x00
Run Code Online (Sandbox Code Playgroud)

所有意思都完全相同:只有AR7x00当前定义宏时,才会处理以下代码.

该#ifdef ...指令只是一个方便的替代方案#if defined ....还有一个#ifndef ...指令; #ifndef FOO相当于#if ! defined FOO.

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

严格地说,这些不是你在普通表达中看到的那种括号括号; 它们是defined运算符语法的一部分,只能在预处理程序#if指令中使用.特别是,这个:

#if defined ((AR7x00))
Run Code Online (Sandbox Code Playgroud)

是语法错误.


小智 5

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

#if  defined( foo )  || defined( bar )
#error SOME PROBLEM
#endif
Run Code Online (Sandbox Code Playgroud)

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

#if defined foo || defined bar
#error SOME PROBLEM
#endif
Run Code Online (Sandbox Code Playgroud)

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