我有一种情况,其中#ifdef
告诉我某些东西没有被定义,但它继续编译一条线,好像它被定义了一样。我无法弄清楚这是怎么回事。
更广泛的背景是我正在试图解决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上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!?!?
如果您需要完整的上下文,请参阅the problem我正在尝试修复链接到压缩项目的链接,在该项目中我能够独立于我自己的项目重现此问题...但请单独回答这个问题。
答案 0 :(得分:4)
SERVICE_STATUS
是使用typedef
定义的类型定义;你的另一个问题的答案中包含了文档的链接。
#ifdef
仅用于确定名称是否被定义为具有#define
(或通过编译器选项)的宏,您不能使用它来测试类型,变量或函数已定义。它是预处理器的一部分,而不是编译器,因此它对代码的这些元素一无所知。
答案 1 :(得分:4)
这两个预处理器指令只告诉你 ,是否将SERVICE_STATUS
定义为预处理器宏,即是否有一行说#define SERVICE_STATUS something
在#ifdef
之前的某个地方。这与&#34;定义&#34;不同在非预处理器意义上。
答案 2 :(得分:2)
SERVICE_STATUS
is a struct
,不是宏(尽管有可怕的误导性名称)。因此预处理器无法检测到它。