函数参数中的struct关键字和const-correctness

Cat*_*ann 4 c c++ const-correctness

我的库中有一个opaque类型定义为:

typedef struct MyOpaqueType* MyType;  // easier to type for client code
Run Code Online (Sandbox Code Playgroud)

我不能使用typedef传递一个指向const的指针结构,所以有些函数看起来像:

void UsePointerToConst ( const struct MyOpaqueType * )
Run Code Online (Sandbox Code Playgroud)

代替:

void UserPointerToConst( const MyType ) // can't use, is really constant pointer
Run Code Online (Sandbox Code Playgroud)

所以,鉴于此,我有两个问题:参数列表中的struct关键字只在C中是必需的吗?有一个更好的方法吗?我应该创建一个typedef,例如:

typedef const struct MyOpaqueType* ConstantMyType; ?
Run Code Online (Sandbox Code Playgroud)

Fre*_*Foo 5

参数列表中的struct关键字只在C中是必需的吗?

是.见Jens Gustedt的回答.

有一个更好的方法吗?

只是typedef结构,而不是指针.这更好,因为

  • 你只需要一个typedef,而不是一个为每个{ MyOpaqueType,MyOpaqueType *,MyOpaqueType const *,MyOpaqueType *constMyOpaqueType const *const}以及涉及所有变体restrict(其中不存在C++)
  • 用户很清楚指针语义适用,即传递数据类型实际上是指针复制的问题(没有性能担忧),用户不太可能忘记使用后清理,C++用户可能会使用智能指针,以及
  • 这是一个常见的C约定(想想FILE *).

也没有危险; 当有人忘记时*,他们会收到编译错误.

  • @Cat它存在但不完整.你仍然可以输入它. (4认同)