类型定义和结构命名空间在 C 与 C++ 中
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'
我想我注定要将结构 def 移动到标题中并放弃使用该技术,但我真的不想(这个成语在很多代码中使用,有些是我的,有些不是),并想我会在这里检查是否有人有任何见解。
PS:如果你不知道这个习惯用法,它让你把结构定义保留在实现C文件中,然后接口的用户(MyAST.h
)无法进入结构,他们必须在实现中使用你的函数。
老实说,如果这里的唯一目的是使用一些旧库(我们假设它们不会更新),我会在您的C++和旧库之间创建一个胶水层。只需编写少量用 C 编译的包装器代码即可使用旧库,并提供一个 C 接口,该接口C++编译到新的C++代码中。
拥有相同的名称意味着两个不同的东西只会在未来的维护者中引起混淆,所以我会尝试将接口代码隔离到几个源文件中。
最后,虽然我很欣赏想要在某些时候将接口与实现分开,但您必须相信您的代码用户不会公然违反库的条件,而只是以明显的方式对其进行编码,而不是偏执地隐藏结构定义。
相关文章:
- 命名空间中具有.h和.cpp文件的类
- 从父命名空间重载类型
- 在命名空间中定义函数还是限定函数
- C++:对不存在的命名空间使用命名空间指令
- 通过继承类使用来自不同命名空间的运算符
- 使用命名空间时出现多个定义错误
- CUDA内核和数学函数的显式命名空间
- 嵌套的匿名命名空间
- CMakeLists.txt中的命名空间表示法
- 类是C++中的命名空间吗
- 在命名空间中使用全局命名空间中的函数
- 如何使 std::sort 在 std::swap 和我的命名空间的模板化交换之间没有名称冲突?
- '使用命名空间{嵌套在另一个命名空间中的某个命名空间}"
- 是否可以将函数导入命名空间,但不能导出它?
- C++ C++类中的命名空间降级
- 如何使用 soong 命名空间来有条件地编译模块
- 使用 Clang++ 有没有办法将文件作为命名空间等包含?
- 使用 make 编译 MPI,几个命名空间错误,例如"错误:未知类型名称'使用'?
- 如何通过命名空间调用非静态方法
- 在命名空间名称之前加上 :: 是什么意思?