我是 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 具有异常的控制流行为,may与 C++ 异常和析构函数的交互效果不佳,具体取决于您的 C 库实现者避免该问题的彻底程度。
setjmp
and longjmp
显然是这里的一个问题(有没有人做过一个 C 库来实现这些在之上DWARF 风格的异常处理?)但也是如此fork
, setcontext
和朋友,pthread_cancel
, pthread_cleanup_push
,可能还有其他一些我一时记不起的。 (我记得 2004 年左右,Ulrich Drepper 和 GCC C++ 人员之间关于到底如何pthread_cancel
应该在存在析构函数的情况下表现。)
如果您超越 POSIX,您可能还会遇到以下问题:
- 不费心将所有声明包装在一个标头中
extern "C"
当编译为 C++ 时,会出现块,这意味着所有函数名称都会在不应该的情况下被破坏,并且链接失败。
- Headers that don't even bother to stick to the intersection of C and C++. In the worst case, this can cause failures that don't manifest until the program is run. The most common instances of this are:
- 愉快地使用一些 C++ 关键字作为声明名称(例如
int template;
)
- 假如说
void *
赋值是否与其他指针类型兼容(例如,不需要强制转换malloc
)
- 假如说
struct foo;
does not定义一个 typedef 名称foo
请注意,headersPOSIX 指定的扩展通常包含系统特定的扩展,这些扩展没有像 POSIX 接口本身那样经过仔细考虑。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)