Избегайте предупреждения о недостижимом коде для кода, зависящего от препроцессора

Я пытаюсь выяснить, есть ли способ избежать получения предупреждения «Недостижимый код» для чего-то, что вызвано препроцессором. Я не хочу подавлять все такие предупреждения, только те, которые будут зависеть от препроцессора, например.

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

И позже есть код, который идет:

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

Один из этих двух разделов всегда будет определяться как «Недостижимый код», и у нас их много. Я хотел бы попытаться избавиться от многих предупреждений, которые он создает, но я все еще хочу получать предупреждения для законно недостижимого кода. (На самом деле платформ больше, чем две, поэтому каждый фрагмент кода для конкретной платформы создает кучу ненужных предупреждений.)


person Darrel Hoffman    schedule 26.07.2013    source источник
comment
Используйте этот вопрос в качестве справочного материала. Заголовок stackoverflow.com/questions/1930793/ В частности, посмотрите на ответ Джейсона Дауна.   -  person Daniel Simpkins    schedule 27.07.2013
comment
Сначала я искал другие вопросы, не видел, чтобы кто-то конкретно касался препроцессора по этой проблеме. (Есть много вопросов, касающихся недостижимого кода, но ни один из тех, которые я проверял, не казался одним и тем же сценарием.) Раздражает, что нет никакого способа справиться с этим, который не значительно испортит код, не снизит производительность ( немного) или скрыть потенциально полезные предупреждения.   -  person Darrel Hoffman    schedule 27.07.2013


Ответы (1)


Вариант 1: добавьте макросы препроцессора везде, где у вас есть операторы if. Это будет более производительно, но, возможно, немного уродливее.

Вариант 2: сделать переменную платформы не константой. Установка его на статическое чтение только для меня заставила предупреждение исчезнуть.

person lukegravitt    schedule 26.07.2013
comment
Но с вариантом 2 компилятору придется переводить обе секции или ветви if в IL, и большая часть этого IL никогда не будет использоваться, так что это один вид потерь (хотя и не очень важный, если вас не волнует размер DLL-файла). - person Jeppe Stig Nielsen; 27.07.2013
comment
Я согласен, что вариант 2, вероятно, не то, что я бы сделал, но он самый простой и иногда важный. Стоит отметить, что недостижимый код не транслируется в IL, поэтому изменение его на статическое чтение только для чтения будет хуже, чем ваше текущее затруднительное положение, в то время как вариант 1 будет таким же, но без предупреждения. - person lukegravitt; 27.07.2013
comment
Хм, вечная дилемма между более уродливым кодом и немного более медленным кодом - я знаю, что должен выбрать вариант 1, но мне действительно не нравится загрязнять код препроцессорами повсюду. Мешает читать. Кроме того, поскольку компилятор игнорирует это, в неактивных блоках кода может быть плохой код, который мне не хватает, который будет отображаться только при изменении #defines... - person Darrel Hoffman; 27.07.2013