В API существует ли какое-то преимущество использования типа void *
в качестве дескриптора структур, возвращаемых пользователю (в отличие от использования типа name_of_the_structure *
и просто скрытия реализации)?Скрытие внутренних элементов структуры
ответ
Если вы используете void*
, тогда содержимое является полностью черным ящиком, о котором пользователь ничего не знает. Однако вы также потеряете некоторую безопасность типов, так как пользователь вашего API может передать любой указатель на вашу функцию, и у вас нет простого способа определить, является ли он правильным указателем или нет.
К счастью, вы на самом деле не имеете, чтобы полностью скрыть структуру. Вы просто общедоступный заголовок, который распространяется с API, который декларирует структуру, как
struct my_special_struct;
Тогда ваши функции по-прежнему могут быть объявлены с использованием указателей на эту структуру, и пользователь тоже, но пользователь имеет для использования ваших функций создайте фактические экземпляры, и пользователь также не сможет использовать вашу структуру для доступа к внутренним полям или получения их размера с помощью sizeof
.
Вот что я имел в виду под «скрытием реализации». – user2656304
@ user2656304 Хорошо, тогда нет никакого преимущества использования 'void *'. –
Я не думаю, что это имеет какое-либо преимущество (если вы не пытаетесь взломать «полиморфные» структуры, как я часто это делаю). Это снижает безопасность типа. –