#if 预处理指令并不总是会折叠

4

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

#define TEST
#define TESTOFF

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

#if TEST
    ...
#endif

...MORE CODE...

#if TESTOFF
    ...
#endif

经常发生这样的情况,一个 #if 区域,比如 #if TEST 区域,变得可折叠,而另一个(#if TESTOFF 区域)则不是。

由于这是一种有些人可能从未遇到的奇怪现象,我附上了有问题的快照: Alternating collapsible #if regions

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


我认为,折叠#if-#endif是不可能的。这是代码的一部分。你不能折叠代码。你只能折叠区域和定义。即使属性也会突出显示。 - T.S.
请发布有效的代码,这段代码无法编译。但它也不会崩溃,也不应该崩溃。 - Hans Passant
你为什么要抱怨伪代码无法编译呢?这与所提出的问题完全无关。 - Magus
一开始我也是这么想的。但突然之间,我在 #if #endif 代码块里面加入了可折叠区域。我添加了一张图片以作澄清。 - seebiscuit
@GrantWinney 不,我没有混淆两个不同的指令,但我同意我描述的现象很奇怪。我更新了一张图片。看看吧。 - seebiscuit
显示剩余5条评论
3个回答

5

如果#If测试为假,则显然所有代码都是死代码(无论其结构如何)。合并这些部分是有意义的。

如果#If测试为真,则可能包含任意代码。因此,合并选项是基于代码结构的。在任意的#If测试中不提供合并选项。


4

Damien_The_Unbeliever的评论是正确的。VS为当前设置下处于非活动状态(以灰色显示)的部分提供了折叠功能,而不为活动部分提供此功能。所以,如果我有这段代码:

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

如果我使用Debug配置,则底部将会折叠,但如果我切换到Release配置,则顶部将变为可折叠(而底部则不可折叠)。


0
作为解决问题和/或个人偏好的简单方法,值得注意的是,您可以将任何代码块用大括号{}包裹起来,这样VS就会将其变成可折叠区域。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接