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

dav*_*ler 4 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
Run Code Online (Sandbox Code Playgroud)

不幸的是,由于duplicate 'const'错误,这将无法编译.这typedef是导致问题的原因.如果我只是将函数的原型更改为:

int problematic_fn_proto( const void* const arg );
Run Code Online (Sandbox Code Playgroud)

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

sky*_*ing 7

你得到这个的原因是,现在problem_type它本身就是一个类型,但是唯一的地方是双重const(直接在一个类型之前和之后的const具有相同含义)是有意义的,如果你使用指针.如果您仍想使用,有几个选项typedef

首先是不在typedef中包含指针:

typedef void problem_type;
int problem_fn_proto( const problem_type* const arg);
Run Code Online (Sandbox Code Playgroud)

第二种是const在typedef中包含说明符:

typedef void const* cproblem_type;
typedef void* problem_type; // non-const variant not used here
int problem_fn_proto(cproblem_type const arg);
Run Code Online (Sandbox Code Playgroud)

在最后一个解决方案中,它cproblem_type是一个指向常量数据的指针,使用它cproblem_type const的常量(这是一个指向常量数据的常量指针).

第三种解决方案是注意参数的常量并不意味着什么.如果函数碰巧修改了参数,则从调用者看不到它:

typedef void const* cproblem_type;
int problem_fn_proto(cproblem_type arg);
Run Code Online (Sandbox Code Playgroud)