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

Duplicate const error with C++ wrapping C code

我有一些 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 本身就是一个类型,但是唯一一个双常量(类型前后的常量具有相同的含义)有意义的地方是如果你使用指针。如果您仍想使用 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);