svn merge -r 854:853 l3toks.dtx
или
svn merge -c -854 l3toks.dtx
две команды эквивалентны .
Тип void
не имеет размера; это было бы ошибкой компиляции. По той же причине вы не можете сделать что-то вроде:
void n;
EDIT.
К моему удивлению, выполнение sizeof (void)
на самом деле компилирует в GNU C:
$ echo 'int main() { printf("%d", sizeof(void)); }' | gcc -xc -w - && ./a.out
1
Однако в C ++ этого не происходит:
$ echo 'int main() { printf("%d", sizeof(void)); }' | gcc -xc++ -w - && ./a.out
<stdin>: In function 'int main()':
<stdin>:1: error: invalid application of 'sizeof' to a void type
<stdin>:1: error: 'printf' was not declared in this scope
В C, sizeof (void) == 1
в GCC, но это, похоже, зависит от вашего компилятора.
В C ++ я получаю:
In function 'int main()': Line 2: error: invalid application of 'sizeof' to a void type compilation terminated due to -Wfatal-errors.
Хотя void
может стоять вместо типа, на самом деле он не может содержать значение. Следовательно, у него нет размера в памяти. Получение размера void
не определено.
Указатель void
- это просто языковая конструкция, означающая указатель на нетипизированную память.
sizeof ()
не может применяться к неполным типам. А void
- неполный тип, который нельзя заполнить.
Если вы используете GCC и не используете флаги компиляции, удаляющие специфические расширения компилятора, то sizeof (void)
равно 1. GCC имеет нестандартное расширение , который делает это.
В общем, void
является неполным типом, и вы не можете использовать sizeof для неполных типов.
Ко второй части вопроса: Обратите внимание, что sizeof (void *)! = Sizeof (void). В 32-битной арке sizeof (void *) составляет 4 байта, поэтому p ++ будет установлен соответственно. Величина, на которую увеличивается указатель, зависит от данных, на которые он указывает. Таким образом, он будет увеличен на 1 байт.