5

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

typedef struct FOO_Obj *FOO_Handle;

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

void FOO_work(const FOO_Handle fooHandle);

-ness是如何const应用的?

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

还是UB

4

1 回答 1

2

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

函数调用

void FOO_work(const FOO_Handle fooHandle);

相当于

void FOO_work(struct FOO_Obj* const fooHandle);

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

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

typedef const struct FOO_Obj* FOO_ConstHandle;
于 2015-07-14T13:33:29.500 回答