向不透明句柄添加 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;
如果我创建了一个 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;