Служит ли пустота C * какой-либо иной цели, кроме придания коду большей идиоматичности?
Дает ли C void*
какую-то выгоду в виде оптимизации компилятора и т. д., Или это просто идиоматический эквивалент для char*
? Т. е. если каждый void*
в стандартной библиотеке C будет заменен на char*
, будет ли что-нибудь повреждено, кроме разборчивости кода?
3 ответа:
В исходном K&R C не было типа
void *
,char *
использовался в качестве универсального указателя.
void *
служит двум основным целям:
Это позволяет понять, когда указатель используется в качестве универсального указателя. Ранее вы не могли сказать, используется ли
char *
в качестве указателя на фактический буфер символов или в качестве универсального указателя.Это позволяет компилятору ловить ошибки, когда вы пытаетесь разыменовать или выполнить арифметику на универсальном указателе, а не чем сначала привести его к соответствующему типу. Эти операции не разрешены для значений
void *
. К сожалению, некоторые компиляторы (например,gcc
) по умолчанию разрешают арифметику на указателяхvoid *
, поэтому это не так безопасно, как могло бы быть.
C прекрасно ладил в течение многих лет с
char *
в качестве универсального типа указателя, прежде чемvoid *
был введен позже. Так что это явно не совсем необходимо. Но языки программирования-это коммуникация,не просто говорящая компилятору, что делать, но говорящая другим людям, читающим программу, что она предназначена. Все, что делает язык более выразительным, - это хорошо.
Служит ли c void* какой-либо иной цели, кроме придания коду большей идиоматичности?
Если бы каждый
void*
в стандартной библиотеке C был заменен наchar*
, было бы что-нибудь повреждено, кроме разборчивости кода?C11 ввел
_Genric
. Из-за этого код_Generic(some_C_standard_library_function()) ...
может компилироваться совершенно по-разному в зависимости от того, был ли возвращаемый тип avoid *
,char *
,int *
, и т.д.