可以从C ++编写C头文件

St.*_*rio 6 c c++ software-design library-design

我正在研究应该从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
Run Code Online (Sandbox Code Playgroud)

我从未见过这样的东西,所以我不确定这是否常见。不鼓励这样做吗?有哪些可能的缺点?

wal*_*nut 4

因此,正如我在评论中提到的,我认为这种方法存在三个问题。

首先,如果任何实体应该共享两种语言之间的链接,则它不允许该库与混合 C/C++ 翻译一起使用。如果头文件包含在 C 翻译单元和 C++ 翻译单元中,则所有声明的实体将具有不同的名称,或者带前缀,或者不带前缀。因此,实际上,它就像是两个独立的库,一个在 C 翻译单元中使用,一个在 C++ 翻译单元中使用。如果任何图书馆实体应该在翻译单元之间共享链接,那么它将无法工作。

其次,extern "C"在命名空间内将在 C++ 代码的命名空间内正确确定名称的范围。然而,为了保证 C 链接,必须将没有名称空间前缀的名称引入到全局 C 名称空间中,从而使大量没有库前缀的名称变得混乱。

第三,它使得编写可在 C 和 C++ 之间转换的用户代码变得困难。任何这样的用户都必须引入类似的宏。

如果该库不应该在混合 C/C++ 代码中使用(或没有任何共享链接),那么extern "C"就没有必要,在删除它之后,我认为该方法可能没问题。