函数参数中的struct关键字,以及const正确性

struct keyword in function parameter, and const-correctness

本文关键字:以及 const 正确性 关键字 struct 参数 函数      更新时间:2023-10-16

我的库中有一个不透明类型定义为:

typedef struct MyOpaqueType* MyType;  // easier to type for client code

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

void UsePointerToConst ( const struct MyOpaqueType * )

而不是:

void UserPointerToConst( const MyType ) // can't use, is really constant pointer

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

typedef const struct MyOpaqueType* ConstantMyType; ?

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

是的 请参阅Jens Gustedt的回答。

有更好的方法吗?

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

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

也没有危险;当有人忘记*时,他们会得到一个编译器错误。

在C++中,假设typedefstruct具有相同的名称,只要没有其他具有该名称的标识符。类似于函数stat,它接收一个struct stat*作为自变量:

int stat(const char *path, struct stat *buf);

在C++中甚至是允许的。(这是一个真实的例子。)

所以你总是更擅长像这样的远期申报

typedef struct toto toto;

其在标识符和结构名称空间中保留令牌CCD_ 15。然后可以为C和C++声明函数接口。但是,如果您也想从C访问extern "C",请不要忘记它。

另请参阅:SO和struct标记上的这个答案在C++中不是标识符。

在C++中根本不需要typedef。只需使用正向声明:

struct MyType;

然后根据需要绕过MyType const *MyType *MyType const &等。