gpt4 book ai didi

c++ - Unix 和 Linux API header 是否与 C++ 兼容?

转载 作者:太空狗 更新时间:2023-10-29 20:24:31 28 4
gpt4 key购买 nike

我以前编写过 #include 的 Unix 和 Linux API header 的 C++ 代码,这些程序产生了预期的行为。也就是说,我不知道这是否可以依赖。 C 和 C++ 之间的不兼容性可能会导致有效的 C header 在被 C++ 程序使用时以意想不到的方式运行。

编译为 C++ 的代码能否可靠地使用 Unix 和 Linux API header ?

这是这些 header 作者的目标吗?还是这些 header 仅旨在成为有效的 C?

这样做有什么已知的陷阱吗?

显然,Unix 和 Linux 发行版数量众多,我不希望一个答案能够一一解决每个发行版。我的期望是相同的答案将适用于几乎所有的 Unix 和 Linux 发行版,异常(exception)情况将证明这一规则。如果这个假设是错误的,对此的解释也是有效的答案。

我所说的 Unix header 是指这些:

http://www.unix.org/version3/apis/headers.html

我所说的 Linux header 是指 Linux 发行版提供的 header ,通常作为名为“linux-headers”的包提供,它允许程序与 Linux 内核交互。例如,这个 Debian 软件包:

https://packages.debian.org/wheezy/kernel/linux-headers-3.2.0-4-amd64

我意识到 Unix 链接只是一个规范,每个 Linux 发行版都不同,但我再次怀疑对大多数发行版提出这个问题是合理的。如果那不是真的,请纠正我。

编辑 我只是指用户空间程序使用的 header 。

最佳答案

C 标准头文件,如 <stdio.h> , <stdlib.h>等在 C++ 标准的附录 D 中指定,其中指出:

These are deprecated features, where deprecated is defined as: Normative for the current edition of the Standard, but not guaranteed to be part of the Standard in future revisions.

C 标准 header 的非弃用 C++ 版本的名称类似于 <cstdio> , <cstdlib>等,他们在技术上将他们的定义放入 std (非全局)命名空间。因此,要 100% 符合 C++ 规范中未弃用的部分,您需要编写如下内容:

#include <cstdio>

int main() {
std::printf("Hello, world!\n");
}

也就是说,据我所知,没有任何现有的实现实际上会强制您这样做,而且我认为这不太可能。因此在实践中,您可以在 C++ 中安全地使用 C 标准头文件而无需担心。

此外,如果您在(例如)POSIX 系统上,通常可以同样安全地使用 C++ 中的 POSIX 功能。当然,没有人会故意破坏其中的任何一个,因为用户会反抗。

然而,在混合范式时,意外破损是可以想象的。如果平台和语言标准都提供了某些功能,您应该使用其中之一,但不能同时使用。特别是,我不会将 POSIX 线程和同步机制与标准 C++11 线程和同步机制混合使用,因为很容易想象优化器对后者了解太多并生成与前者不兼容的代码。

[更新,详细说明]

<unistd.h>是我所说的平台相关功能的一个例子。它通常可以在 C++ 中正常工作,库和编译器开发人员都不会无缘无故地破坏它,因为那太烦人了。所以继续调用getpid()pipe()或其他。

但请注意,混合范式会引发各种问题。仅举几例:

  • 你能打给new吗来自信号处理程序?
  • 你能用dup2吗?到描述符 0 上以重定向 cin
  • 在静态初始化期间(即在 main 执行之前)您可以安全地调用哪些 POSIX 函数?

任何规范都没有解决这些问题和其他类似问题。答案取决于您的具体实现,并且可能会因版本而异。

话虽如此……几乎每个重要的 C++ 程序都依赖于某些 C 接口(interface)公开的特定于平台的功能。所以你所描述的在实践中会很好地工作,前提是你(a)知道“幕后”发生了什么; (b) 有合理的期望; (c) 不要试图混合标准范例和特定于平台的范例。

关于c++ - Unix 和 Linux API header 是否与 C++ 兼容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27682579/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com