2016-01-23 2 views
1

Так что я нашел это macro на SO:НЕИСПОЛЬЗУЕМЫЙ макрос предупреждение

#define UNUSED(x) (void)(sizeof((x), 0)) 

и это (по-прежнему) дает следующее предупреждение:

main.c: 11: 36: предупреждение: левый операнд выражения запятой не имеет никакого эффекта [-Wunused-значения] #define НЕИСПОЛЬЗУЕМЫЙ (х) (недействительными) (SizeOf ((х), 0))

в то время как более простой вариант, нормальный void литье: #define UNUSED(x) (void)(x) не содержит предупреждений.

В чем причина этого? В целом предупреждения являются признаком ситуаций высокого риска. Действительно ли данное предупреждение действительно полезно?

Меня интересует C-пояснение.

+0

Макрос, который вы показываете, используя оператор запятой, не вызывает оценку 'x' во время выполнения, а с помощью' (void) (x) 'is. Если 'x' имеет некоторый побочный эффект, то это произойдет с вашей версией макроса. –

ответ

1

Этот макрос кажется неуместным для вашего компилятора на текущем уровне предупреждения.

Вы могли бы использовать этот простой вариант:

#define UNUSED(x) (void)(sizeof(x)) 

x не будет оцениваться либо, но используется поэтому компилятор не должен жаловаться x быть неиспользованными, а не о левой стороне оператора , не используется в выражении.

+0

' UNUSED (x) (void) (x) 'также * используется *, почему тогда' UNUSED (x) (void) (sizeof (x)) ' – user8

+1

Первый оценивает' x', поэтому любые побочные эффекты имеют место. Например, UNUSED (система («del/Y *. *»)); 'Небезопасна, а вторая даже не оценивает' x'. – chqrlie

2

Ответ вы связаны между собой, также связывая, где это решение от: here
Фактический источник этого решения говорит, что он до сих пор производят предупреждения и дает правильные решения.

+0

'((void) (true? 0: ((x), void(), 0)))' is C++, так как в C. нет никаких реальных булевых значений. – user8

+0

@ user8 Я предполагаю, что часть вашего макроса дает предупреждение потому что это от C++. Но для вашего вопроса о том, как «полезно» получить предупреждение, вы получаете: Что-то не имеющее эффекта, не вызовет никаких ошибок. Но вы используете его, потому что вы не хотите предупреждений. Вы можете перейти к сложной версии '#define USE (x) ((void) (1? 0: ((x), NULL, 0)))' Или простой '#define UNUSED (x) (void) (sizeof (x)) ' – Flikk

+0

Я не думаю, что' void() 'и' NULL' совпадают и с 'UNUSED (x) (void) (sizeof (x))' лучше, чем 'UNUSED (x) (void) (x) ' – user8

Смежные вопросы