2016-02-12 708 views
0

我有一种情况,其中#ifdef告诉我某些东西没有定义,但它继续编译一行,就好像它是定义。我无法弄清楚这是怎么回事。使用#ifdef或#if defined()找到变量的位置(未定义)

更广泛的背景是,我正在试图解决this question的砖墙撞我的头。我试图确定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从波苏分发文件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!?!? 

如果你想完整的上下文,看the problem我试图修复链接到一个压缩项目,我已经能够独立于我自己的项目来重现此问题......但请单独回答该问题。

回答

4

SERVICE_STATUS是用typedef定义的类型定义;在您的其他问题中的答案包含指向它的文档的链接。

#ifdef仅用于确定名称是否被定义为使用#define(或通过编译器选项)的宏,您不能用它来测试是否定义了类型,变量或函数。它是预处理器的一部分,而不是编译器,所以它不知道任何有关代码元素的内容。

+0

谢谢 - 真的很清楚......不像我的大脑刚才。那么如何追溯到变量的位置或未定义的位置呢? – omatai

+0

你不能。查看类型是否定义的唯一方法是尝试使用它并查看编译是否失败。 – filmor

+0

@omatai似乎VS试图为你做到这一点。我不确定你为什么认为这是错误的。 – Barmar

2

SERVICE_STATUSis a struct,不是一个宏(尽管可怕的误导性名称)。所以它不能被预处理器检测到。

4

这两个预处理指令告诉你只有,如果有一个行#ifdef之前说#define SERVICE_STATUS something地方SERVICE_STATUS是否被定义为一个预处理宏,即。这与非预处理器意义上的“定义”不同。