【问题标题】:#if preprocessor directive doesn't always collapse#if 预处理器指令并不总是崩溃
【发布时间】: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 不,我不会混淆这两个不同的指令,但我同意我描述的现象是奇怪。我更新了一张图片。看看吧。

标签: c# visual-studio-2010 preprocessor-directive


【解决方案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 将使其成为可折叠区域。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-06-08
        • 2014-01-13
        • 1970-01-01
        • 2011-07-07
        • 1970-01-01
        相关资源
        最近更新 更多