如果我创建了一个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 ?
答案 0 :(得分:2)
B中。 (您提供的代码没有未定义的行为。)
函数调用
void FOO_work(const FOO_Handle fooHandle);
相当于
void FOO_work(struct FOO_Obj* const fooHandle);
函数中的变量fooHandle
将指向一个非const struct FOO_Obj
对象的const指针。您将无法将const限定符添加到fooHandle
以使其成为指向const对象的指针。
相反,如果你想拥有一个指向const对象的指针,并保持结构隐藏,你必须创建另一个typedef:
typedef const struct FOO_Obj* FOO_ConstHandle;