- 1
- 2
- 3
- 4
- 5
- 6
индокод:
#ifdef PRINT_DEBUG_INFO
#define DBG_PRINT if(1) printf
#else
#define DBG_PRINT if(0) printf
#endif
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
+145.4
индокод:
#ifdef PRINT_DEBUG_INFO
#define DBG_PRINT if(1) printf
#else
#define DBG_PRINT if(0) printf
#endif
Индокод - макрос для вкл-выкл дебажной печати.
ну во-первых:
if (1) printf(...) - нахрена тут if (1) ? :)
во-вторых:
if (0) printf(...) - не проще было бы вообще убрать все это, поставив // ?
индус одним словом.
сам ты индус. макрос правильный. if-ы стоят, чтобы безопасно закомментировать код. потому что никакие // макросами не подставляются:
#include <stdio.h>
#define A //
#define B printf
int main()
{
A printf("A\n");
B("B\n");
return 0;
}
mini:~/Develop/crap$ g++ comment1.cpp
mini:~/Develop/crap$ ./a.out
A
B
mini:~/Develop/crap$
к этому
#define A /##/
#ifdef PRINT_DEBUG_INFO
#define DBG_PRINT printf
#else
#define DBG_PRINT
#endif
так проще
Да нормальный код
Попробуйте написать
DBG_PRINT("%d",i); j=12345;
В индусском коде все будет работать
В том варианте, где предлагается камменты впендюрить, вы будете долго-долго искать почему у вас интересное такое значение j получается при отладке и без нее разное (не надо разводить разговоры, что мол, нехорошо писать два оператора на одной строке - надо иметь защиту от идиотов, которые так делают)
В том варианте, где предлагается
#else
#define DBG_PRINT
#endif
получиться гавно с кучей ошибок-предупреждений при компиляции.
Сделать надо так
#ifdef PRINT_DEBUG_INFO
#define DBG_PRINT printf
#else
#define DBG_PRINT if(0) printf
#endif
умный компилер сам выкинет все после if(0)
хорош тем, что side-эффекты будут проявляться и в дебажном, и в недебажном билде.
2 old-гавнокодер: не стоит забывать, что в коде
#define DBG_PRINT //
сначала вырежутся комментарии, а уже потом сработает парсер макросов.
if (something_done)
DBG_PRINT("something done");
else
do_something();
превратится в
if (something)
if ( <0 или 1> ) printf("something done");
else
do_something();
Насколько я помню, else в таком случае привязывается к последнему if (это надо проверять, под рукой компилятора нет; нормальный компилятор по идее предупреждение должен выдать). Поэтому do_something() будет вызываться не тогда, когда надо.
#define DBG_PRINT if(PRINT_DEBUG_INFO) printf
?
помоему праильно...