1. Си / Говнокод #797

    +145.4

    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, 31 Марта 2009

    Комментарии (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]
      помоему праильно...
      Ответить

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