Служит ли пустота 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 *, и т.д.