函数参数中的struct关键字,以及const正确性
struct keyword in function parameter, and const-correctness
我的库中有一个不透明类型定义为:
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
,而不是{MyOpaqueType
、MyOpaqueType *
、MyOpaqueType const *
、MyOpaqueType *const
和MyOpaqueType const *const
}中的每一个以及所有涉及restrict
的变体(在C++中不存在) - 用户很清楚,指针语义是适用的,即传递数据类型实际上是指针复制的问题(无性能问题),用户不太可能忘记使用后的清理,C++用户可能使用智能指针,并且
- 这是一个常见的C约定(想想
FILE *
)
也没有危险;当有人忘记*
时,他们会得到一个编译器错误。
在C++中,假设typedef
与struct
具有相同的名称,只要没有其他具有该名称的标识符。类似于函数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 &
等。