Единственная цель сложного выражения (void)0
- избегать предупреждений компилятора. Если у вас просто было голое, бесполезное выражение, компилятор может предупредить о выражении, которое не имеет никакого эффекта. Но, явно приведя что-то к void
, вы указываете, что хотите это сделать.
(Подумайте о том, как запуталось бы это, если бы компилятор вдруг сказал: «Предупреждение: выражение 0;
не имеет никакого эффекта.», Когда все, что вы сделали, переключилось в режим выпуска.)
Это было также обычной практикой в C, где вы сказали бы (void)printf("Hello");
, чтобы сообщить компилятору, что вы намеренно решили игнорировать возвращаемое значение функции.
Приведение (void)
- это не просто выбор конкретной реализацией; это требуется по стандарту C. Цитируя стандарт ISO C 2011 года (аналогичная формулировка появляется в изданиях 1990 и 1999 годов):
Если NDEBUG
определено как имя макроса в точке исходного файла
где <assert.h>
включен, макрос assert
определяется просто как
#define assert(ignore) ((void)0)
Стандарт C ++ требует, чтобы содержимое заголовка <cassert>
совпадало с заголовком Standard C <assert.h>
.