向不透明句柄添加 const-ness

Adding const-ness to opaque handle

如果我创建了一个 C 模块,它向用户提供一个指向前向声明结构的句柄,如下所示:

typedef struct FOO_Obj *FOO_Handle;

如果我随后声明将其用作 const 合格参数的函数原型:

void FOO_work(const FOO_Handle fooHandle);

如何应用 const-ness?

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

还是UB?

乙。 (您提供的代码没有未定义的行为。)

函数调用

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;