Добавление константы к непрозрачной ручке
Если бы я создал модуль 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;