我正在尝试在一些新的 C++ 中使用一些旧的 C 库。
该库的头文件使用 D. Hanson 的“C 接口和实现”实现隐藏习惯用法:
#define T MyAST
typedef struct T *T;
据我所知,这可以用 C 编译,因为在 C 中,结构名称和 typedef 名称位于不同的命名空间中,但它不能用 C++ ( extern "C" { #include "MyAST.h" }
) 编译,这显然是因为 typedef 和结构名称位于相同的命名空间中。
conflicting declaration 'typedef struct MyAST* MyAST'
我认为我注定将 struct def 移动到标题中并放弃使用该技术,但我真的不想(这个成语在很多代码中使用,有些是我的,有些不是)并认为我会检查here,看看是否有人有任何见解。
PS:如果您不知道习语,它可以让您将结构定义保留在实现C文件中,然后接口(MyAST.h
)的用户无法进入结构,他们必须在实现中使用您的函数。