我们可以在 c++ 中使用 POSIX C 库吗?
Can we use the POSIX C libraries in c++?
我是Linux系统编程领域的新手。我目前用 C 编程,想切换到 c++。
我们可以在 c++ 中使用 POSIX C 库中定义的所有函数而不进行任何更改吗?
原则上,你应该能够使用C++中的任何C API;该语言包括促进它的功能,大多数C库作者都知道人们想要这样做,并会采取适当的步骤。 对于 POSIX 指定的系统编程接口,C++兼容性是一个明确的设计目标。
但是,您可能仍会遇到问题。 根据我的经验,最常见的问题是:
- C API 标头通常会将数百个符号转储到全局命名空间中。 其中一些符号可能与C++库符号冲突,如果您
using namespace std
,这会给您带来麻烦(但您没有这样做,对吧? - C API 标头经常大量使用宏,包括宏名称,是的,可能与C++库符号冲突;
std::
不会在那里救你。 - 以严格的一致性模式编译程序(例如
-std=c++11 -D_XOPEN_SOURCE=700
) 可能会暴露系统标头中的错误。 这更有可能发生在C++而不是 C 上。 - 一小部分 POSIX API 具有异常的控制流行为,可能与异常和析构函数交互不良C++具体取决于 C 库实现器在避免问题方面的彻底程度。
setjmp
和longjmp
显然是一个问题(有没有人做过一个C库来实现DWARF风格的异常处理?),但fork
,setcontext
和朋友,pthread_cancel
,pthread_cleanup_push
,可能还有其他一些我不记得的。 (我记得在2004年左右,Ulrich Drepper和GCC C++人员之间关于pthread_cancel
在析构函数面前应该如何表现的争论,最终没有定论。
如果您超越 POSIX,您可能还会遇到以下问题:
当- 编译为 C++ 时,不会费心将所有声明包装在
extern "C"
块中的标头,这意味着所有函数名称在不应该被破坏时都会被破坏,并且链接失败。 - 甚至懒得坚持 C 和 C++ 的交集的标头。 在最坏的情况下,这可能会导致在程序运行之前不会出现的故障。 最常见的例子是:
- 轻率地使用一些C++关键字作为声明的名称(例如
int template;
) - 假设
void *
赋值与其他指针类型兼容(例如,不需要强制转换malloc
的结果) - 假设
struct foo;
没有定义 typedef-namefoo
- 轻率地使用一些C++关键字作为声明的名称(例如
请注意,POSIX 指定的标头经常包含特定于系统的扩展,这些扩展不像 POSIX 接口本身那样经过仔细考虑。
"我们可以在 c++ 中使用 POSIX C 库中定义的所有函数而不做任何更改吗?">
当然可以。任何 C 样式的 API 都可以在 C++ 中无缝使用。
相关文章:
- C/C++编译器通常会删除重复的库吗
- 我可以在 Arduino 的库文件夹之外安装库吗?
- 我可以将c ++清理器仅应用于程序的一部分而不是第三方库吗?
- cmake 可以包含具有头文件和库文件但没有 .cmake 文件的库吗?
- 我可以在源代码外使用 Clang 库吗?
- C++ 标准库是静态库吗?
- 我可以在编译Qt应用程序的同时忽略Qt的打包库吗?
- 我可以使用 JNI 调用 Python 库吗?
- 我需要SQL服务器才能使用Qt的QtSql库吗?
- 我们可以在 c++ 中使用 POSIX C 库吗?
- 我可以使用 C 程序中的C++模板库吗?
- cmake,我可以从可执行对象构建一个库吗?
- 我们可以在链接期间加载动态库吗
- 我可以使用由C使用dlopen从C++编译的共享库吗
- Linux命令libboost所有的开发人员都安装并编译只包含头的库吗
- 我应该从源代码编译一个库吗
- 我可以创建一个链接另一个库但不依赖于其include的c++库吗
- 我可以从多个目标制作一个库吗
- 我可以在Apache模块中安全地使用Boost和/或C++库吗
- visual有人在C++项目中使用过Triangle/Tangle++库吗?(delaunay三角测量)