void
не имеет размера. В C и C ++ выражение sizeof (void)
недействительно.
В C, цитируя N1570 6.5.3.4, пункт 1:
Оператор
blockquote>sizeof
не должен применяться к выражению, имеющему тип функции или неполному типу , к имени в скобках такого типа или выражению, которое обозначает член битового поля.(N1570 - проект стандарта ISO C 2011 года.)
void
является неполным типом. Этот абзац является ограничением , что означает, что любой соответствующий C-компилятор должен диагностировать любое его нарушение. (Диагностическое сообщение может быть предупреждением, не несущественным.)Стандарт C ++ 11 имеет очень похожую формулировку. Оба выпуска были опубликованы после того, как этот вопрос был задан, но правила восходят к стандарту ANSI C 1989 года и самым ранним стандартам C ++. На самом деле правило, что
void
является неполным типом, к которомуsizeof
не может применяться, возвращается точно так же, как введениеvoid
в язык.gcc имеет extension , который рассматривает
sizeof (void)
как 1. gcc по умолчанию не является совместимым компилятором C, поэтому в режиме по умолчанию он не предупреждает оsizeof (void)
. Расширения, подобные этому, разрешены даже для полностью совместимых компиляторов C, но диагностика по-прежнему требуется.