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

时间:2015-10-19 03:55:07

标签: c++ c c++11 g++4.8

我已经从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和它作为函数的参数必须保留。

1 个答案:

答案 0 :(得分:7)

你得到这个的原因是现在problem_type是它自己的一种类型,但是唯一的地方是double 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);