编写可以从 C++ 使用的 C 头文件

Compose C header file to be able to be used from C++

我正在处理一些应该在 C 和 C++ 中使用的库头文件。由于 C 没有名称空间概念,因此我会向头文件中定义的所有名称添加 "library prefix"。相比之下,对于 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

我从来没有见过这样的事情,所以我不确定这是否常见。这样做是不是气馁了?可能的缺点是什么?

所以,正如我在评论中提到的,我发现这种方法存在三个问题。

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

其次,命名空间内的 extern "C" 将为 C++ 代码在命名空间内正确限定名称范围。但是,为了保证C链接,必须在全局C命名空间中引入不带命名空间前缀的名称,使它被大量不带库前缀的名称弄得一团糟。

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

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