C vs C ++中的typedef和struct命名空间

我试图在一些新的C ++中使用一些旧的C库。

该库的头文件使用D. Hanson的“C接口和实现”实现隐藏成语:

#define T MyAST typedef struct T *T; 

接近我可以说,这用C编译,因为在C中,struct struct和typedef名称在不同的名称空间中但是它不能用C ++编译( extern "C" { #include "MyAST.h" } ),因为typedef和struct names在同一名称空间中。

 conflicting declaration 'typedef struct MyAST* MyAST' 

我想我注定要将struct def移到标题中并放弃使用该技术,但我真的不想(这个成语用在很多代码中,有些是我的,有些不是)并认为我是在这里查看是否有人有任何见解。

PS:如果你不知道这个成语,它可以让你将结构定义保存在实现C文件中,然后接口的用户( MyAST.h )无法访问结构,他们必须在实现中使用你的函数。

老实说,如果这里唯一的目的是使用一些旧库(我们假设不会更新),我会在你的C ++和旧库之间创建一个粘合层。 只需编写少量的用C编译的包装代码来使用旧库,并提供一个C语言接口,用C ++编译为新的C ++代码。

具有相同的名称意味着两个不同的东西只会导致未来维护者之间的混淆,所以我会尝试将接口代码隔离到几个源文件。

最后,虽然我可以欣赏在某些时候想要将接口与实现分离,但您必须相信您的代码用户不会公然违反库的条件并且只是以明显的方式对其进行编码而不是偏执地隐藏struct定义了。