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

问题描述 投票:0回答:4

我有一种情况,

#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!?!?

如果您想要完整的上下文,请参阅问题我正在尝试修复压缩项目的链接,在该项目中我能够独立于我自己的项目重现此问题...但请单独回复该问题。

c++ c-preprocessor
4个回答
4
投票

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

#ifdef
仅用于确定名称是否通过
#define
(或通过编译器选项)定义为宏,不能使用它来测试类型、变量或函数是否已定义。它是预处理器的一部分,而不是编译器的一部分,因此它对代码的这些元素一无所知。


4
投票

这两个 preprocessor 指令仅告诉您

 是否被定义为预处理器宏,即 
SERVICE_STATUS
 之前是否有一行表示 
#define SERVICE_STATUS something
。这与非预处理器意义上的“定义”不同。



0
投票
好像还不行,比如VS14。这是一个遗憾。

© www.soinside.com 2019 - 2024. All rights reserved.