4

我有一些 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 及其用作函数的参数必须保留。

4

1 回答 1

7

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

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

typedef void problem_type;
int problem_fn_proto( const problem_type* const arg);

第二种是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);

在最后一个解决方案中,thecproblem_type是指向常量数据的指针,usingcproblem_type const表示其中的一个常量(即指向常量数据的常量指针)。

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

typedef void const* cproblem_type;
int problem_fn_proto(cproblem_type arg);
于 2015-10-19T06:19:44.767 回答