我试图在一些新的C ++中使用一些旧的C库。
图书馆的头文件使用D. Hanson的"C Interfaces and Implementations"实现隐藏成语:
#define T MyAST
typedef struct T *T;
我可以说,这可以用C编译,因为在C中,struct结构名和typedef名在不同的名称空间中,但它不能用C ++(extern "C" { #include "MyAST.h" }
)编译,因为typedef和struct name在同一名称空间中
conflicting declaration 'typedef struct MyAST* MyAST'
我认为我注定要将struct def移动到标题中并放弃使用该技术,但我真的不想(这个成语用于很多代码,有些是我的,有些不是)和思想我会在这里查看是否有人有任何见解。
PS:如果您不知道这个习惯用法,它可以让您将结构定义保留在实现C文件中,然后接口的用户(MyAST.h
)无法访问结构,他们必须使用你在实施中的职能。
答案 0 :(得分:6)
老实说,如果这里唯一的目的是使用一些旧库(我们假设不会更新),我会在你的C ++和旧库之间创建一个粘合层。只需编写少量用C语言编译的包装代码来使用旧库,并提供一个C语言接口,用C ++编译为新的C ++代码。
具有相同的名称意味着两个不同的东西只会导致未来维护者之间的混淆,所以我会尝试将接口代码隔离到几个源文件。
最后,虽然我很欣赏想要在某些时候将接口与实现分离,但您必须相信您的代码用户不会公然违反库的条件,只是以明显的方式对其进行编码而不是偏执长度隐藏结构定义。