将const-ness添加到opaque句柄

时间:2015-07-14 12:34:23

标签: c const typedef handle opaque-pointers

如果我创建了一个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 个答案:

答案 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;