Правильный макрос препроцессора C № -op

Для ведения журнала отладки я часто видел и использовал что-то вроде

#ifdef DEBUG
    #define DLOG(fmt, args...) printf("%s:%d "fmt,__FILE__,__LINE__,args)
#else
    #define DLOG(fmt, args...)
#endif

но в ряде мест я видел, как второе #defineзаменено на

#define DLOG(fmt, args...) do {} while (0)

В частности, есть этот ответ , а комментарий к этому другому ответу на тот же вопрос предполагает, что проблема будет в ситуации типа

if (condition)
    DLOG("foo");

хотя мой быстрый тест предполагает, что результирующая точка с запятой в строке сама по себе будет служить оператором no -op внутри условного оператора.

Тот или иной из ничем и do {} while (0)лучше? Если да, то почему? Есть ли что-то еще, что еще лучше?

7
задан Community 23 May 2017 в 11:51
поделиться