我是 Linux 系统编程领域的新手。我目前使用 C 编程,想切换到 C++。
我们能否在 C++ 中使用 POSIX C 库中定义的所有函数而无需任何更改?
最佳答案
原则上您应该能够使用来自 C++ 的任何 C API;该语言包含促进它的功能,并且大多数 C 库作者都知道人们想要这样做并将采取适当的步骤。对于 POSIX 指定的系统编程接口(interface),C++ 兼容性是一个明确的设计目标。
但是,您可能仍然会遇到问题。根据我的经验,最常见的问题是:
- C API header 通常会将数百个符号转储到全局 namespace 中。其中一些符号可能与 C++ 库符号冲突,如果您
使用命名空间 std
(但您没有这样做,对吗?),这会给您带来麻烦 - C API 头文件经常大量使用宏,包括可能与 C++ 库符号冲突的宏名称;
std::
不会在那里保存你。 - 以严格的一致性模式(例如
-std=c++11 -D_XOPEN_SOURCE=700
)编译您的程序可能会暴露系统 header 中的错误。与 C 相比,C++ 更有可能发生这种情况。 - 一小部分 POSIX API 具有异常的控制流行为,可能与 C++ 异常和析构函数交互不良,这取决于您的 C 库实现者在避免问题方面的彻底程度。
setjmp
和longjmp
显然是这里的一个问题(有没有人做过一个 C 库来实现这些 DWARF 风格的异常处理?)但是还有fork
、setcontext
和 friend 、pthread_cancel
、pthread_cleanup_push
,可能还有一些我不记得了离开我的头顶。 (我记得大约在 2004 年 Ulrich Drepper 和 GCC C++ 人员之间关于pthread_cancel
在析构函数存在的情况下应该如何表现的巨大的,最终没有定论的争论。)
如果您超越 POSIX,您可能还会遇到以下问题:
- 当编译为 C++ 时, header 不会费心将所有声明包装在
extern "C"
block 中,这意味着所有函数名称都在不应该被破坏的情况下被破坏,并且链接失败。 - 头文件甚至不屑于坚持 C 和 C++ 的交集。在最坏的情况下,这可能会导致在程序运行之前不会出现的故障。最常见的例子是:
- 愉快地使用一些 C++ 关键字作为声明名称(例如
int template;
) - 假设
void *
赋值与其他指针类型兼容(例如,没有必要转换malloc
的结果) - 假设
struct foo;
确实不定义了一个 typedef-namefoo
- 愉快地使用一些 C++ 关键字作为声明名称(例如
请注意,POSIX 指定的 header 经常包含系统特定的扩展,这些扩展没有像 POSIX 接口(interface)本身那样经过仔细考虑。
关于c++ - 我们可以在 C++ 中使用 POSIX C 库吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29952576/