2013-08-08 2 views
1

В API существует ли какое-то преимущество использования типа void * в качестве дескриптора структур, возвращаемых пользователю (в отличие от использования типа name_of_the_structure * и просто скрытия реализации)?Скрытие внутренних элементов структуры

+1

Я не думаю, что это имеет какое-либо преимущество (если вы не пытаетесь взломать «полиморфные» структуры, как я часто это делаю). Это снижает безопасность типа. –

ответ

2

Если вы используете void*, тогда содержимое является полностью черным ящиком, о котором пользователь ничего не знает. Однако вы также потеряете некоторую безопасность типов, так как пользователь вашего API может передать любой указатель на вашу функцию, и у вас нет простого способа определить, является ли он правильным указателем или нет.

К счастью, вы на самом деле не имеете, чтобы полностью скрыть структуру. Вы просто общедоступный заголовок, который распространяется с API, который декларирует структуру, как

struct my_special_struct; 

Тогда ваши функции по-прежнему могут быть объявлены с использованием указателей на эту структуру, и пользователь тоже, но пользователь имеет для использования ваших функций создайте фактические экземпляры, и пользователь также не сможет использовать вашу структуру для доступа к внутренним полям или получения их размера с помощью sizeof.

+0

Вот что я имел в виду под «скрытием реализации». – user2656304

+1

@ user2656304 Хорошо, тогда нет никакого преимущества использования 'void *'. –

Смежные вопросы