Служит ли пустота C * какой-либо иной цели, кроме придания коду большей идиоматичности?


Дает ли C void* какую-то выгоду в виде оптимизации компилятора и т. д., Или это просто идиоматический эквивалент для char*? Т. е. если каждый void* в стандартной библиотеке C будет заменен на char*, будет ли что-нибудь повреждено, кроме разборчивости кода?

3 3

3 ответа:

В исходном K&R C не было типа void *, char * использовался в качестве универсального указателя.

void * служит двум основным целям:

  1. Это позволяет понять, когда указатель используется в качестве универсального указателя. Ранее вы не могли сказать, используется ли char * в качестве указателя на фактический буфер символов или в качестве универсального указателя.

  2. Это позволяет компилятору ловить ошибки, когда вы пытаетесь разыменовать или выполнить арифметику на универсальном указателе, а не чем сначала привести его к соответствующему типу. Эти операции не разрешены для значений void *. К сожалению, некоторые компиляторы (например, gcc) по умолчанию разрешают арифметику на указателях void *, поэтому это не так безопасно, как могло бы быть.

C прекрасно ладил в течение многих лет с char * в качестве универсального типа указателя, прежде чем void * был введен позже. Так что это явно не совсем необходимо. Но языки программирования-это коммуникация,не просто говорящая компилятору, что делать, но говорящая другим людям, читающим программу, что она предназначена. Все, что делает язык более выразительным, - это хорошо.

Служит ли c void* какой-либо иной цели, кроме придания коду большей идиоматичности?

Если бы каждый void* в стандартной библиотеке C был заменен на char*, было бы что-нибудь повреждено, кроме разборчивости кода?

C11 ввел _Genric. Из-за этого код _Generic(some_C_standard_library_function()) ... может компилироваться совершенно по-разному в зависимости от того, был ли возвращаемый тип a void *, char *, int *, и т.д.