C++封装C代码时出现重复const错误

4
我有一些C代码,包括并且被一个C++应用程序使用,这里是重要的部分: C代码
ifdef __cplusplus
extern "C" {
endif

...
typedef void* problem_type;

...
int problematic_fn_proto( const problem_type const arg );

ifdef __cplusplus
}
endif

很不幸,由于出现了“重复的'const'”错误,这段代码无法编译。问题出在typedef上。如果我只是将函数原型更改为:
int problematic_fn_proto( const void* const arg );

没有更多问题。不幸的是,我无法删除 typedef。在这里有解决方案吗?我可以对 C 部分进行其他更改,但是 typedef 及其作为函数参数的使用必须保留。

请注意,const problem_typeproblem_type const 都是 void* const 的别名,而不是 const void* const - cpplearner
@cpplearner 请解释一下。说const void* const意味着地址和地址指向的值都是不可变的,这种说法正确吗? - davepmiller
查看任何C++ FAQ,它应该解释指向常量和常量指针之间的区别。话虽如此,为什么你不能修复代码呢? - Ulrich Eckhardt
1个回答

7
你收到这个信息的原因是现在 problem_type 已经成为自己的类型,但是仅在使用指针时双重const(直接在类型之前和之后使用const)才有意义。如果你仍然想使用typedef,有几个选项。
第一种方法是不在typedef中包含指针:
typedef void problem_type;
int problem_fn_proto( const problem_type* const arg);

第二种方法是在typedef中包含const限定符:
typedef void const* cproblem_type;
typedef void* problem_type; // non-const variant not used here
int problem_fn_proto(cproblem_type const arg);

在最后一个解决方案中,cproblem_type 是指向常量数据的指针,使用 cproblem_type const 意味着该常量是指向常量数据的常量指针。
第三个解决方案是注意到参数的不可变性并不意味着太多。如果函数恰好修改了参数,则调用者看不到这一点:
typedef void const* cproblem_type;
int problem_fn_proto(cproblem_type arg);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接