Generalnie staram się unikać zbyt częstego korzystania z kompilacji warunkowej, jeśli to możliwe.
Po pierwsze, jest zwykle brzydka i mniej czytelna.
Ale jeszcze ważniejsze, gdy projekty używać kompilacja warunkowa, aby włączyć debugowanie kodu & off I czasami napotkasz problemy, że debugowanie kodu staje się czerstwy, gdy jest wyłączony. Kiedy chcę użyć tego kodu debugowania, włączam go i ... rzeczy. Nie rób tego. Budować. Już nie.
Kod debugowania może odnosić się do zmiennych lub funkcji, które już nie istnieją lub do rzeczy, które w innym przypadku zostały zmienione na tyle, że nie są już poprawne pod względem składni.
To może być naprawdę irytujące.
Więc ja osobiście podjęte w celu uniknięcia kompilacja warunkowa, aby włączyć/wyłączyć debugowanie kodu na korzyść stosując wyliczenie lub makro (który nadal jest warunkowo skompilowane) do wykorzystania jako warunek w instrukcji if
. Po skompilowaniu jako if (0)
generowany jest kod środowiska wykonawczego - dokładnie tak, jak jest to pożądane. Ale kod jest nadal kompilowany i sprawdzany pod względem składni, więc zawsze jest przynajmniej poprawny pod względem składniowym.
#if NDEBUG // using the same standard macro that `assert()` uses
// use your own if NDEBUG doesn't make sense
enum {
DebugOn = 0
}
#else
enum {
DebugOn = 1
}
#endif
// ... elsewhere
if (DebugOn) {
// this always gets compiled, but if it's a release build
// the compiler will not emit anything...
}
Jak FryGuy mentioned, można łatwo łączyć z tym dzwoni MyFunction()
jeśli chcesz - w budowie uwalnianiu, funkcja nie zostanie wywołana na skutek zwarcia, który jest zachowanie określono:
if (DebugOn && MyFunction(expression)) {
// this always gets compiled, but if it's a release build
// the compiler will not emit anything...
}
Ale osobiście, prawdopodobnie używać
if (DebugOn) {
if (MyFunction(expression)) {
// ...
}
}
co moim zdaniem pomaga wywołać trochę jaśniej (tylko trochę), że jest to debu blok tylko g.
Ma to zalety polegające na tym, że kompiluje się zawsze i nie ma kontroli przepływu ukrytej za makrami (kilka innych odpowiedzi wymieniło jako złe).
Jeśli nie kompilujesz całkowicie bez optymalizacji, 'if (fałsz) {kod}' nie umieszcza niczego na wyjściu. –
Och, myślałem, że kompilatory są mniej inteligentne. Dzięki – valerio
Zasadniczo kompilator jest mądrzejszy od Ciebie. Może nie ** ty, ale na pewno ja. –