将const-ness添加到opaque句柄

Tob*_*oby 5 c typedef const handle opaque-pointers

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

typedef struct FOO_Obj *FOO_Handle;
Run Code Online (Sandbox Code Playgroud)

如果我然后声明函数原型使用它作为const限定参数:

void FOO_work(const FOO_Handle fooHandle);
Run Code Online (Sandbox Code Playgroud)

如何const应用?

const struct FOO_Obj *FOO_Handle // A
struct FOO_Obj *const FOO_Handle  // B
const struct FOO_Obj *const FOO_Handle  // C
Run Code Online (Sandbox Code Playgroud)

或者是UB

thi*_*his 2

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

函数调用

void FOO_work(const FOO_Handle fooHandle);
Run Code Online (Sandbox Code Playgroud)

相当于

void FOO_work(struct FOO_Obj* const fooHandle);
Run Code Online (Sandbox Code Playgroud)

函数中的变量fooHandle将被编码为指向非 conststruct FOO_Obj对象的 const 指针。您将无法添加 const 限定符以fooHandle使其成为指向 const 对象的指针。

相反,如果您想要一个指向 const 对象的指针,并保持结构隐藏,则必须创建另一个 typedef:

typedef const struct FOO_Obj* FOO_ConstHandle;
Run Code Online (Sandbox Code Playgroud)