![](/img/trans.png)
[英]Boolean in ifdef: is “#ifdef A && B” the same as “#if defined(A) && defined(B)”?
[英]Using #ifdef or #if defined() to find where a variable is (not) defined
我遇到一种情况,其中#ifdef
告诉我未定义某些内容,但是它会像定义它一样继续编译一行。 我不知道怎么回事。
更广泛的情况是,我将头撞在砖墙上,试图解决这个问题 。 我试图确定在已编译项目和未编译项目中定义SERVICE_STATUS
的时间点。 就Visual Studio 2015而言,如果我右键单击“ SERVICE_STATUS
”一词并转到其定义,则在两种情况下,我都会进入同一文件:winsvc.h。 因此,我认为路径不是问题。
所有这些使我在各个地方引入了以下五行检查,以了解我是否可以理解在何处包含/定义了SERVICE_STATUS
:
#if defined(SERVICE_STATUS) // or #ifdef SERVICE_STATUS
#pragma message( "SS is defined" )
#else
#pragma message( "SS is NOT defined" )
#endif
在所有情况下,包括在编译和非编译情况下都使用SERVICE_STATUS
那一刻之前, 未定义唯一打印的消息是SS 。 这是不编译的行,我可以通过在它之前引起故意的错误来证明它正在被解析:
static SERVICE_STATUS _serviceStatus;
我的头撞得太多了吗,以至于我在使用#ifdef
或#if defined()
明显的男生错误(我都尝试过)? 或者,如果未定义SERVICE_STATUS
,如何编译?
这是发生这种情况的上下文的示意图(在pocoproject.org的Poco发行版的serverserver.h文件中):
... // lots of irrelevant lines omitted...
[5LC] // apply my 5-line check
#include <ThisFile>
#include <ThatFile>
[5LC] // check again and find no change due to header inclusion
... // many more lines skipped...
[5LC] // one last check prior to using SERVICE_STATUS - still no change
static SERVICE_STATUS _serviceStatus; // variable results!?!?
如果您想获得完整的上下文信息,请参阅我正在尝试解决的问题,以获取到一个压缩项目的链接,在该项目中,我能够独立于我自己的项目来重现此问题...但是请单独回答该问题。
SERVICE_STATUS
是使用typedef
定义的类型定义; 您其他问题的答案包含指向其文档的链接。
#ifdef
仅用于确定是否使用#define
(或通过编译器选项)将名称定义为宏,您不能使用它来测试是否已定义类型,变量或函数。 它是预处理器的一部分,而不是编译器的一部分,因此它对代码的那些元素一无所知。
这两个预处理器指令仅告诉您,是否将SERVICE_STATUS
定义为预处理器宏,即是否在#ifdef
之前某行显示#define SERVICE_STATUS something
。 在非预处理器意义上,这与“定义”不同。
SERVICE_STATUS
是一个struct
,而不是一个宏(尽管存在令人误解的可怕名称)。 因此预处理器无法检测到它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.