Powiedzmy, że chcę mieć w kodzie kilka typów komunikatów wyjściowych. Jednym z nich jest DEBUG
, który jest drukowany tylko wtedy, gdy kod jest kompilowany w trybie debugowania.
Zwykle musiałbym napisać coś takiego
#ifdef DEBUG
std::cout << "Debug message" << std::endl;
#endif
co jest dość kłopotliwe i denerwujące w użyciu w wielu miejscach.
Czy dobrą praktyką jest definiowanie makra dla fragmentu kodu, abyś mógł z niego korzystać w ten sposób?
MSG_DEBUG("Debug message")
A może istnieje inny, bardziej elegancki sposób radzenia sobie z tym bez makr? Interesują mnie możliwe rozwiązania zarówno w C, jak i C ++, ponieważ używam obu języków w różnych projektach.
constexpr if
na przykład w C ++.STDERR
. Ponadto, dlaczego nie zrobić to zależyNDEBUG
jakassert()
robi zamiast? Następnie możesz zdefiniować go tak#define DEBUG_MSG(MSG) assert(std::cerr << MSG)
, który testuje również stan strumienia.Odpowiedzi:
Jasne, jeśli nie masz nic przeciwko używaniu makr, to zdefiniowanie sparametryzowanego zamiast powtarzania tego samego kodu warunkowego jest z pewnością bardziej pożądane pod każdym względem dobrego kodowania.
Czy w ogóle powinieneś używać makr? Moim zdaniem należy, ponieważ jest akceptowaną praktyką w C, a wszelkie makro mniej rozwiązanie wymaga co najmniej coś wykonywane nawet poza trybem debugowania. Typowy programista C wybierze nieco brzydkie makro w stosunku do niepotrzebnego wysiłku w czasie wykonywania.
źródło
Jest tu element osobistych preferencji, ale w C ++ wolę to zrobić w pliku nagłówkowym:
Tak, że funkcja jest wbudowana w kompilacje wersji, ale jest właściwą funkcją w kompilacji debugowania, dzięki czemu można mieć właściwe sprawdzanie typu, rozsądne komunikaty o błędach itp., A także możliwość dodania dalszej funkcjonalności (może rejestrowania?) Później.
Oczywiście musisz również zawrzeć odpowiednią definicję funkcji w
.cpp
pliku w#ifdef _DEBUG
bloku.źródło
Zdecydowanie upewnij się, że nie postępujesz zgodnie ze wskazówkami kodu podanymi przez Twój zespół. Upewnij się, że żaden inny kod w systemie nie próbuje osiągnąć tej samej funkcjonalności poprzez ogólny warunek if.
źródło