我正在处理应该从C和C ++一起使用的某些库头文件。由于C没有命名空间概念,因此我将在头文件中定义的所有名称中添加“库前缀”。相比之下,对于C ++,我将定义一个名称空间。所以我目前认为设计是这样的:
mylib.h
#ifdef __cplusplus
namespace mylib{
#define NAME_PREFIX(identifier) identifier
extern "C" {
#else
#define NAME_PREFIX(identifier) mylib_identifier
#endif
int NAME_PREFIX(foo)(void);
//other declarations go here
#ifdef __cplusplus
} //extern "C"
} //namespace mylib
#endif
我从未见过这样的事情,所以我不确定这是否很常见。不鼓励这样做吗?可能有什么弊端?
答案 0 :(得分:4)
因此,正如我在评论中提到的那样,这种方法存在三个问题。
首先,如果要让任何实体共享两种语言之间的链接,则不允许将该库与C / C ++混合翻译一起使用。如果头文件包含在C转换单元和C ++转换单元中,则所有声明的实体将具有不同的名称,带有前缀或不带前缀。因此,实际上,它们好像是两个独立的库,一个在C翻译单元中使用,一个在C ++翻译单元中使用。如果任何图书馆实体应该在翻译部门之间共享链接,那将是行不通的。
第二,命名空间中的extern "C"
将在C ++代码的命名空间中正确限制名称。但是,为了保证C的链接,必须将没有名称空间前缀的名称引入全局C名称空间中,使其杂乱无章地包含很多没有库前缀的名称。
第三,这使得编写在C和C ++之间也应可翻译的用户代码变得困难。任何此类用户都必须引入类似的宏。
如果该库不应该用于混合C / C ++代码(或没有任何共享链接),那么extern "C"
是不必要的,删除它后,我认为这种方法可能会很好。