Скомпилирует ли код 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 для всех этих операторов будет очень медленным и трудоемким, а иногда даже невозможным.