我们有一个很大的旧C++应用程序,其中包含大量遗留代码和一些用C语言编写的外部库。这些库很少更新 - 只有当我们发现一个错误和供应商提供补丁。这发生在上周的一个图书馆,并在整合新版本后,我们发现如果我们不在本地修改图书馆(我们显然是用最后一个版本做的),我们的版本会打破这个错误信息:在C++中处理C库匿名结构类型
non-local function ‘static E* MyCls::myFct(<anonymous struct>*)’ uses anonymous type
这是由于图书馆宣布了一些手柄类型是这样的:
#define _Opaque struct {unsigned long x;} *
typedef _Opaque Handle;
typedef _Opaque Request;
这是我们在一些班函数签名就在我们身边使用:
class MyCls {
public:
static void* myFct(Handle handle);
...
}
由于_Opaque结构没有名称,编译器无法为函数创建合适的名称 - 名称,这会产生上述错误。
我们对这个当前的解决方法是打补丁库的头文件,明确给予结构的名称:
//#define _Opaque struct {unsigned long x;} * //Replaced by typedef below!
typedef struct __Opaque {unsigned long x;} * _Opaque;
这显然是不好的,因为我们不希望尽可能地接触到库中。另一个更糟糕的选择是将所有函数签名中的类型转换为void*
并将它们转换回它们各自的类型。并且有最坏的选择来重写纯C中的每个受影响的函数...
所以,我的问题是:是否有比修补库更好的选项?我忽略了一个简单的解决方案吗?解决这个问题的最好方法是什么?
看不到这与C有什么关系。你的问题是C++包装器的名称改变,不是? – 2012-08-13 12:11:36
这可能是升级到C++ 11的一个很好的参数,它没有这个限制。 – ecatmur 2012-08-13 12:13:10
@JensGustedt,是正确的,但我也将它标记为C,因为库是用C语言编写的,从技术上讲它是C/C++互操作性问题。 – l4mpi 2012-08-13 12:19:47