Почему (void)0 останавливает предупреждения «утверждение не имеет эффекта»?

У меня есть макрос trace()Я включаю и выключаю его с помощью другого макроса, например

#ifdef TRACE
    #define trace(x) trace_val(x, 0)
#else
    #define trace(x) 0
#endif

Это генерирует предупреждение: заявление без эффектаот gcc, когда я вызываю trace()с TRACEundefined. После небольшого поиска я обнаружил, что изменение

#define trace(x) 0

на

#define trace(x) (void)0

убирает ошибку. Мой вопрос: почему? Какая разница?

9
задан blueshift 5 April 2012 в 03:19
поделиться