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

nav*_*ore 2 c c++ compiler-construction struct typedef

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

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

#define T MyAST 

typedef struct T *T;
Run Code Online (Sandbox Code Playgroud)

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

conflicting declaration 'typedef struct MyAST* MyAST'
Run Code Online (Sandbox Code Playgroud)

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

PS:如果你不知道这个习惯用法,它允许你将结构定义保存在实现C文件中,然后interface(MyAST.h)的用户无法访问结构,他们必须在实现中使用你的函数.

Mar*_*k B 6

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

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

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