我们有一个庞大而古老的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语言... ...那么,我的问题是:有比修补库更好的选择吗?我是否忽略了简单的解决方案?解决这个问题的最佳方法是什么?
typedef struct OpaqueHandle { unsigned long x*; } *Handle;
。 - Adam Bowen