Добавление константы к непрозрачной ручке

Если бы я создал модуль C, который представляет дескриптор пользователю с указателем на заранее объявленную структуру, вот так:

typedef struct FOO_Obj *FOO_Handle;

Если я тогда объявлю прототипы функций, которые используют его как const квалифицированный параметр при этом:

void FOO_work(const FOO_Handle fooHandle);

Как const-несс применяется?

const struct FOO_Obj *FOO_Handle // A
struct FOO_Obj *const FOO_Handle  // B
const struct FOO_Obj *const FOO_Handle  // C

Или это UB?

1 ответ

Решение

Б. (Нет неопределенного поведения с кодом, который вы представили.)

Вызов функции

void FOO_work(const FOO_Handle fooHandle);

эквивалентно

void FOO_work(struct FOO_Obj* const fooHandle);

переменная fooHandle в функции будет закодирован постоянный указатель на неконстантный struct FOO_Obj объект. Вы не сможете добавить квалификатор const в fooHandle сделать его указателем на объект const.

Вместо этого, если вы хотите иметь указатель на const-объект и держать структуру скрытой, вы должны сделать еще один typedef:

typedef const struct FOO_Obj* FOO_ConstHandle;
Другие вопросы по тегам