Неполный тип с размером - PullRequest
0 голосов
/ 20 октября 2018

Я пишу библиотеку C, и у меня есть структура, которая выглядит (примерно) как:

struct Obj {
    char tag,
    union { 
        int i,
        void *v
    } val
};

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

Я использовал неполные типы в заголовке для других, более крупных типов в моем API, к которым пользователь может обращаться только через указатель.Я не хочу ограничивать доступ пользователей к Obj через указатель, так как Obj, скорее всего, будет максимум 16 байт.

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

Мой вопрос таков: есть ли способ предоставить тип с размером только в C (нет сведений о полях в данной структурепользователю), какой-нибудь другой взлом, чтобы выполнить то, что я хочу, или я должен реализовать это каким-то совершенно другим способом?

Пожалуйста, прокомментируйте, если я не предоставил достаточно деталей, или что-то неясно.

1 Ответ

0 голосов
/ 20 октября 2018

Стандартный шаблон для этого - создать функцию, которая выделяет структуру для пользователя:

struct Obj* obj_new(void) {
  return malloc(sizeof(struct Obj));
}

Затем просто оставьте тип как неполный в вашем общедоступном заголовке.

КонечноЕсли вы действительно хотите выставить только размер, вы можете просто создать функцию, которая возвращает sizeof(struct Obj).Очевидно, что люди могут использовать его неправильно (например, жестко запрограммировать значение в своем коде как «оптимизацию», чтобы избежать вызова этой функции), но это не на вас.Это то, что иногда делается, обычно для облегчения наследования.

...