#if 预处理器指令并不总是崩溃

Posted

技术标签:

【中文标题】#if 预处理器指令并不总是崩溃【英文标题】:#if preprocessor directive doesn't always collapse 【发布时间】:2014-01-30 18:43:32 【问题描述】:

假设我定义了两个#define 预处理器指令:

#define TEST
#define TESTOFF

现在我的代码组织在 TEST 和 TESTOFF #if 指令中,例如:

#if TEST
    ...
#endif

...MORE CODE...

#if TESTOFF
    ...
#endif

经常发生一个#if 区域,例如#if TEST 区域,变得可折叠,而另一个(#if TESTOFF 区域)则不是。

由于这是一些人可能从未遇到过的奇怪现象,因此我附上了相关问题的快照:

有谁知道哪些参数定义了#if 预处理器指令的这种行为行为?

【问题讨论】:

我不认为,有可能崩溃#if - #endif。这是代码的一部分。你不能折叠代码。您只能折叠区域和定义。甚至属性都突出 发布有效代码,这不会编译。也不会崩溃。也不应该。 你为什么抱怨伪代码不能编译?这与提出的问题完全无关。 @T.S.一开始我也是这么想的。但是,突然间我在 #if #endif 块内有了可折叠的区域。我添加了一张图片来澄清。 @GrantWinney 不,我不会混淆这两个不同的指令,但我同意我描述的现象是奇怪。我更新了一张图片。看看吧。 【参考方案1】:

如果#If 测试为假,那么显然其中的所有代码(无论其结构如何)都是死代码。提供折叠这些部分是有意义的。

如果#If 测试为真,则其中可能包含任意代码。所以折叠选项是基于 code 结构的。并且在任意 #If 测试中不提供折叠。

【讨论】:

【参考方案2】:

Damien_The_Unbeliever 的评论是正确的。 VS 为使用当前设置不活动的部分(显示为灰色的部分)提供折叠功能,并且不为活动部分提供它们。所以如果我有这个代码:

#if DEBUG
     string a = "2";
     string b = "3";
#else
     string a = "3";
     string b = "3";
#endif

当我激活 Debug 配置时,底部是可折叠的,但如果我将其切换到 Release,顶部将变为可折叠(而底部不可折叠)。

【讨论】:

【参考方案3】:

作为折叠问题和/或个人偏好的简单解决方法,值得注意的是,您可以将任何代码块包装在大括号 中,VS 将使其成为可折叠区域。

【讨论】:

以上是关于#if 预处理器指令并不总是崩溃的主要内容,如果未能解决你的问题,请参考以下文章

Unity预处理器指令错误?

预处理器指令

C#如何获取已定义预处理器的列表?

在 C# 的 #if 中使用 #define 预处理器指令是不是有效

如何从预处理器#if 指令调用 constexpr 函数?

#define 预处理器指令可以包含 if 和 else 吗?