Скомпилирует ли код C внутри блока if (false)?

Мне просто интересно, скомпилированы ли эти кодовые блоки в .dll

Я не думаю, что этот компилируется вообще

#if SOMETHING_UNDEFINED
// some code - this is ignored by the compiler
#endif

Как насчет этих?

1.

if(false) {
  // some code - is this compiled?
}

2.

const bool F = false;
if(F) {
  // some code - is this compiled?
}

3.

bool F = false;
if(F) {
  // some code - is this compiled?
}

EDIT: Извините, я говорил о Visual Studio

Ответы

Ответ 1

Просто тестируя его, компилятор Microsoft С# 4 этого не делает, и похоже, что компилятор Mono gmcs версии 2.4.0.0 тоже не работает. Я не знаю, что там что-то в спецификации запрещало это, хотя.

EDIT: Когда я ответил на это, появилась только первая версия. Случай 2 эквивалентен случаю 1, но случай 3 не является.

Ответ 2

Просто добавление к ответу:

Причина в том, что я верю, что это будет делать только статическую проверку. в первом случае, если (false), он увидит этот недостижимый код с помощью простой проверки шаблона, поэтому он не будет компилировать его (должен также дать предупреждение).

Для второго случая, поскольку F является константой, и он знает, что он никогда не меняется, при статической проверке он может просто сделать замену. [F- > ложно] < < тело → . и это даст тот же самый код, что и первый.

Последняя сложна. Поскольку невозможно понять, что 100% использует статическую проверку только того, что такое значение F. С#, как и все императивные языки, имеют побочные эффекты.

представьте, если вы немного переписываете код

bool F = false; 
foo(ref F);
if(F) { 
  // some code - is this compiled? 
} 

Проблема здесь в том, что она не знает, что Foo делает для F., чтобы узнать, она должна была бы отслеживать (и, возможно, оценивать) функцию, теперь представить себе очень большие программы с большим количеством этих шаблонов, в конце концов, если утверждения используются много, попытка найти значение времени выполнения F для всех этих операторов будет очень медленным и трудоемким, а иногда даже невозможным.