Это было бы унаследовано!
До появления стандарта C функция free()
имела бы (неявно) тип int
, поскольку еще не было надежного типа void
чтобы вернуть. Не было возвращено значение.
Когда код был впервые изменен для работы со стандартными C компиляторами, он, вероятно, не включал <stdlib.h>
(потому что он не существовал до стандарта). Старый код писал бы extern char *malloc();
(возможно, без extern
) для функций распределения (аналогично для calloc()
и realloc()
), и ему не нужно было объявлять free()
. И код затем приведёт возвращаемое значение к правильному типу - потому что это было необходимо по крайней мере в некоторых системах (включая ту, которую я изучил C on).
Некоторое время спустя преобразование (void)
было добавлено, чтобы сообщить компилятору (или, более вероятно, lint
), что «возвращаемое значение из free()
намеренно игнорируется», чтобы избежать жалоб. Но было бы лучше добавить <stdlib.h>
и позволить его объявлению extern void free(void *vp);
сообщить lint
или компилятору, что не было значения игнорировать.
JFTR: В середине 80-х годов Первоначально ICL Perq был ориентирован на слово, и адрес char *
для ячейки памяти сильно отличался от «указателя что-нибудь» в том же месте. Важно было как-то объявить char *malloc()
; было важно преобразовать результат из него в любой другой тип указателя. Приведение фактически изменило число, используемое процессором. (Было также много радости, когда основная память в наших системах была обновлена с 1 МБ до 2 МБ - поскольку ядро использовало около 3/4 МБ, это означало, что пользовательские программы могли использовать 1 1/4 МБ до paging et c .)