Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 括号在#if定义的预处理器运算符中是什么意思?_C_C Preprocessor_Preprocessor Directive - Fatal编程技术网

C 括号在#if定义的预处理器运算符中是什么意思?

C 括号在#if定义的预处理器运算符中是什么意思?,c,c-preprocessor,preprocessor-directive,C,C Preprocessor,Preprocessor Directive,(我正在开发一个SDK,其中引用了特定SDK的代码,但无法跟踪程序的流程。) 什么是 #if defined (AR7x00) 什么意思?具体来说,在这样的预处理器操作符中,括号的用途是什么?可以使用带括号或不带括号的定义的状态 从: 还可以使用括号对符号和运算符进行分组 括号除了将符号和运算符组合在一起以修改优先级外,不会执行任何操作。这三个预处理器指令: #if defined (AR7x00) #if defined AR7x00 #ifdef AR7x00 所有这些都意味着完全相

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

什么是

#if defined (AR7x00)
什么意思?具体来说,在这样的预处理器操作符中,括号的用途是什么?

可以使用带括号或不带括号的
定义的状态

从:

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


括号除了将符号和运算符组合在一起以修改优先级外,不会执行任何操作。

这三个预处理器指令:

#if defined (AR7x00)

#if defined AR7x00

#ifdef AR7x00
所有这些都意味着完全相同的事情:仅当宏
AR7x00
当前已定义时,才会处理以下代码

#ifdef…
指令只是
#的一个方便的替代品(如果定义了…
)。还有一个
#ifndef…
指令
#ifndef FOO
等同于
#if!定义的FOO

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

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

#if defined ((AR7x00))

是一个语法错误。

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

#if  defined( foo )  || defined( bar )
#error SOME PROBLEM
#endif
在我的gnu arm gcc环境中的计算结果与此不同

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

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

它在
AR7x00
周围添加了括号。其目的是防止疯狂。如果你不知道一对括号在C中的作用,那么请阅读K&R。这个问题似乎离题了,因为它没有展示任何关于所使用语言的知识。顺便说一句,
#define
不是一个语句,而是一个预处理器指令。我认为你暂时搁置这个问题有点草率。这个问题可能形式不太好,但很明显,函数
defined()
是这里的主题。给它一个简单的答案,它是好的。没有必要关闭它。我想每个人都读标题,而不是问题。:)这不是一个
#define
,而是一个
#if defined()
。由于定义的
不是函数(它是预处理器运算符),因此不需要括号。GNU和Microsoft都没有定义C语言。@KeithThompson,是的,我同意,只是向他指出了不同的信息来源,这样他就可以得到更多的细节。感谢分享有价值的知识,但是我正在尝试更改sdk代码以适合我的具体情况,因此当我查看sdk代码时,我发现没有宏AR7X00或(AR7X00)的定义。sdk开发人员甚至可能在头文件中隐藏这些宏定义…?@TrilokM:它可以由编译器预定义,可能通过命令行选项(如
-DAR7X00
)来预定义,也可能没有定义,这就是
#ifdef
测试的内容。谢谢。我工作的是电力线设备,其中包含两种芯片组,即AR7400和INT6400,因为这些芯片组是由编译器预定义的,我是否应该在编译期间仅提供选项-DAR7X00。。?因为代码在编译时出错。您没有提到编译错误。也许你应该发布一个新问题,因为这个问题已经得到了回答。@TrilokM:你给我们看的那句话不会产生那个错误
ARX700
ARX700
是不同的标识符。如果你有一个问题,而不是括号的意思,你可能应该分别发帖。