繁体   English   中英

使用#ifdef或#if define()查找(未)定义变量的位置

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM