Няшная / Говнокод #797 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
индокод:
#ifdef PRINT_DEBUG_INFO
#define DBG_PRINT if(1) printf
#else
#define DBG_PRINT if(0) printf
#endif

Индокод - макрос для вкл-выкл дебажной печати.

Запостил: guest guest, (Updated )

Комментарии (11) RSS

  • А мне понравилось. При выкл печати параметры будут подставляться и ошибка диагностироваться, но в бинарник это не попадёт.
    Ответить
  • Ja!:
    ну во-первых:
    if (1) printf(...) - нахрена тут if (1) ? 🙂

    во-вторых:
    if (0) printf(...) - не проще было бы вообще убрать все это, поставив // ?

    индус одним словом.
    Ответить
  • индеец:
    сам ты индус. макрос правильный. if-ы стоят, чтобы безопасно закомментировать код. потому что никакие // макросами не подставляются:

    mini:~/Develop/crap$ cat comment1.cpp
    
    #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$
    Ответить
    • mini:~/Develop/crap$ cat comment1.cpp

      #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 /##/
      Ответить
  • compiler:
    #ifdef PRINT_DEBUG_INFO
    #define DBG_PRINT printf
    #else
    #define DBG_PRINT
    #endif

    так проще
    Ответить
  • old-гавнокодер:
    Да нормальный код

    Попробуйте написать

    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)
    Ответить
  • Вообще говоря, вариант
    #ifdef PRINT_DEBUG_INFO
    #define DBG_PRINT printf
    #else
    #define DBG_PRINT
    #endif

    хорош тем, что 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

    ?
    Ответить
  • [url=http://grow.yolins.com/]Rimmichna[/url]
    помоему праильно...
    Ответить

Добавить комментарий

Из-за тебя ушел bormand, guest!

    А не использовать ли нам bbcode?


    8