【问题标题】:Avoid "Unreachable code" warning for preprocessor-dependent code避免预处理器相关代码的“无法访问代码”警告
【发布时间】:2013-07-27 07:05:42
【问题描述】:

我试图弄清楚是否有任何方法可以避免因预处理器引起的某些事情而收到“无法访问的代码”警告。我不想抑制所有此类警告,只抑制那些将依赖于预处理器的警告,例如

#if WINDOWS
    public const GamePlatform platform = GamePlatform.PC;
#else
    public const GamePlatform platform = GamePlatform.MAC;
#endif

后来有代码:

if (platform == GamePlatform.PC)
{
    ...
}
else
{
    ...
}

这两个部分中的一个将始终被检测为“无法访问的代码”,我们到处都有。我想尝试摆脱它创建的许多警告,但我仍然想获得合法无法访问代码的警告。 (实际上,平台不止两个,因此每一块特定于平台的代码都会产生一堆不必要的警告。)

【问题讨论】:

  • 将此问题作为参考。 stackoverflow.com/questions/1930793/…具体看Jason Down的回答。
  • 我确实先搜索了其他问题,没有看到任何专门针对此问题处理预处理器的问题。 (关于无法访问的代码有很多问题,但我检查的所有问题似乎都不是相同的情况。)令人烦恼的是,没有某种方法可以解决这个问题,既不会显着丑化代码,也会降低性能(略),或隐藏可能有用的警告。

标签: c# visual-studio-2010 c-preprocessor compiler-warnings unreachable-code


【解决方案1】:

选项 1:在有 if 语句的地方添加预处理器宏。这会更高效,但可能有点丑。

选项 2:使平台变量不是 const。将其设置为静态只读使警告对我来说消失了。

【讨论】:

  • 但是使用“选项 2”,编译器必须将 if 的“部分”或“分支”都翻译成 IL,其中大部分 IL 将永远不会被使用,所以这是一种浪费(尽管如果您不关心 DLL 文件的大小,则不是很重要)。
  • 我同意选项 2 可能不是我会做的,但它是最简单的,有时这很重要。值得一提的是,“无法访问的代码”并未翻译成 IL,因此将其更改为 static readonly 将比您当前的困境“更糟糕”,而选项 1 将相同减去警告。
  • 嗯,丑陋的代码与稍慢的代码之间的永恒困境 - 我知道我应该选择选项 1,但我真的不喜欢用预处理器的东西污染代码这个地方。使它更难阅读。此外,由于编译器会忽略它,因此我丢失的非活动代码块中可能存在错误代码,只有在更改 #defines 时才会显示...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-05-22
  • 1970-01-01
  • 1970-01-01
  • 2023-03-13
  • 2011-01-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多