Czy dobrą praktyką jest używanie #ifdef podczas programowania do przełączania różnych typów zachowań? Na przykład chcę zmienić zachowanie istniejącego kodu, mam kilka pomysłów, jak zmienić zachowanie i konieczne jest przełączanie się między różnymi implementacjami, aby przetestować i porównać różne podejścia. Zwykle zmiany w kodzie są złożone i wpływają na różne metody w różnych plikach.
Zazwyczaj wprowadzam kilka identyfikatorów i robię coś takiego
void foo()
{
doSomething1();
#ifdef APPROACH1
foo_approach1();
#endif
doSomething2();
#ifdef APPROACH2
foo_approach2();
#endif
}
void bar()
{
doSomething3();
#ifndef APPROACH3
doSomething4();
#endif
doSomething5();
#ifdef APPROACH2
bar_approach2();
#endif
}
int main()
{
foo();
bar();
return 0;
}
Pozwala to szybko przełączać się między różnymi podejściami i robić wszystko w jednej kopii kodu źródłowego. Czy to dobre podejście do rozwoju, czy jest lepsza praktyka?
#ifdef
blokach, jeśli blok jest wyłączony. Natknęliśmy się na przypadki, w których kod może łatwo zestarzeć się i nie skompilować, jeśli nie budujesz rutynowo wszystkich ścieżek.
#ifdefs
mniej uciążliwymi.