我们有一个大型的、旧的 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 重写每个受影响的函数是最糟糕的选择......
所以,我的问题是:有没有比修补库更好的选择?我忽略了一个简单的解决方案吗?解决这个问题的最佳方法是什么?