#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 预处理器指令并不总是崩溃的主要内容,如果未能解决你的问题,请参考以下文章