如果我创建了一个 C 模块,它向用户提供一个指向前向声明结构的句柄,如下所示:
typedef struct FOO_Obj *FOO_Handle;
如果我然后声明将其用作 const
限定参数的函数原型(prototype):
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?
最佳答案
B. (您提供的代码没有未定义的行为。)
函数调用
void FOO_work(const FOO_Handle fooHandle);
相当于
void FOO_work(struct FOO_Obj* const fooHandle);
函数中的变量fooHandle
将成为指向非常量struct FOO_Obj
对象的const 指针。您将无法将 const 限定符添加到 fooHandle
以使其成为指向 const 对象的指针。
相反,如果您想要一个指向常量对象的指针,并隐藏该结构,您必须创建另一个 typedef:
typedef const struct FOO_Obj* FOO_ConstHandle;
关于c - 向不透明句柄添加 const-ness,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31406719/