在c++包装的C代码中重复const错误



我有一些c++应用程序中包含和使用的C代码,这里的重要部分:

C代码

ifdef __cplusplus
extern "C" {
endif
...
typedef void* problem_type;
...
int problematic_fn_proto( const problem_type const arg );
ifdef __cplusplus
}
endif

不幸的是,由于duplicate 'const'错误,这将无法编译。是typedef引起了这个问题。如果我把函数的原型改成:

int problematic_fn_proto( const void* const arg );

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

你得到这个的原因是,现在problem_type是一个类型在它自己的权利,但唯一的地方双const (const直接之前和之后的类型具有相同的含义)有意义的是,如果你使用指针。如果你仍然想使用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);

最新更新