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