使用 #ifdef 或 #if 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 发行版的文件 serverapplication.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,而不是一个宏(尽管这个名字非常具有误导性(。因此,预处理器无法检测到它。

最新更新