繁体   English   中英

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

[英]typedef and struct namespaces in C vs C++

我试图在一些新的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移到头文件中并放弃使用该技术,但是我真的不想(很多语言中使用了这个习惯用法,有些是我的,有些则没有),并且我想在这里查看是否有人有任何见识。

PS:如果您不了解该惯用语,则可以将结构定义保留在实现的C文件中,然后接口的用户( MyAST.h )无法访问该结构,则他们必须在实现中使用您的函数。

老实说,如果这里的唯一目的是使用一些旧库(我们假定不会更新),我将在您的C ++和旧库之间创建一个胶合层。 只需编写少量在C中编译的包装器代码以使用旧库,并提供一个C接口即可将C ++编译为新的C ++代码。

具有相同的名称意味着两个不同的事物只会在将来的维护者之间引起混乱,因此我将尝试将接口代码隔离到几个源文件中。

最后,尽管我希望在某些时候将接口与实现分开,但您必须相信您的代码用户不要公然违反库的条件,而只是以一种明显的方式对其进行编码,而不是使用偏执的长度来隐藏结构定义消失了。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM