我们可以在 c++ 中使用 POSIX C 库吗?

2024-01-01

我是 Linux 系统编程领域的新手。我目前使用 C 编程,想切换到 C++。

我们可以在 c++ 中使用 POSIX C 库中定义的所有函数而不进行任何更改吗?


原则您应该能够使用 C++ 中的任何 C API;该语言包含有利于它的功能,大多数 C 库作者都知道人们想要这样做,并将采取适当的步骤。对于POSIX规定的系统编程接口来说,C++兼容性是一个明确的设计目标。

但是,您仍然可能会遇到问题。根据我的经验,最常见的问题是:

  1. C API 标头通常将数百个符号转储到全局命名空间中。其中一些符号可能与 C++ 库符号冲突,如果您using namespace std(但你并没有这样做,对吧?)
  2. C API 标头经常大量使用宏,包括可能与 C++ 库符号冲突的宏名称;std::不会在那里救你。
  3. 以严格的一致性模式编译您的程序(例如-std=c++11 -D_XOPEN_SOURCE=700)可能会暴露系统标头中的错误。这种情况在 C++ 中比 C 更容易发生。
  4. 少数 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,您可能还会遇到以下问题:

  1. 不费心将所有声明包装在一个标头中extern "C"当编译为 C++ 时,会出现块,这意味着所有函数名称都会在不应该的情况下被破坏,并且链接失败。
  2. 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(使用前将#替换为@)

我们可以在 c++ 中使用 POSIX C 库吗? 的相关文章

  • 在 HKCR 中创建新密钥有效,但不起作用

    我有以下代码 它返回 成功 但使用两种不同的工具使用搜索字符串 3BDAAC43 E734 11D5 93AF 00105A990292 搜索注册表不会产生任何结果 RegistryKey RK Registry ClassesRoot C
  • Environment.CurrentDirectory 与 System.IO.Directory.GetCurrentDirectory

    我正在编写一个 Net WinForms 并不断在调试和发布配置之间切换 并且有一些文件我需要任一配置才能访问 我想做的是将文件放在 BIN 文件夹中的公共目录中 这样它看起来像这样 MyProject Bin CommonFiles My
  • 有些有助于理解“产量”

    在我不断追求少吸的过程中 我试图理解 产量 的说法 但我不断遇到同样的错误 someMethod 的主体不能是迭代器块 因为 System Collections Generic List 不是迭代器接口类型 这是我被卡住的代码 forea
  • 无法注册时间触发的后台任务

    对于 Windows 8 应用程序 在 C Xaml 中 我尝试注册后台任务 很难说 但我想我的后台任务已正确注册 但是当我单击调试位置工具栏上的后台任务名称时 我的应用程序停止工作 没有任何消息 我查看了事件查看器上的日志 得到 具有入口
  • 如何将 .txt 文件中的数据转换为 xml? C#

    我在一个文本文件中有数千行数据 我想通过将其转换为更容易搜索的内容来轻松搜索 我希望 XML 或其他类型的大型数据结构 尽管我不确定它是否是最好的对于我的想法 每行的数据如下所示 第 31 册 托马斯 乔治 32 34 154 每本书都不是
  • 语音识别编程问题入门

    所以 你们可能都看过 钢铁侠 其中托尼与一个名为贾维斯的人工智能系统进行交互 演示剪辑here http www youtube com watch v Go8zsh1Ev6Y 抱歉 这是广告 我非常熟悉 C C 和 Visual Basi
  • Eigen 和 OpenMP:由于错误共享和线程开销而没有并行化

    系统规格 Intel Xeon E7 v3 处理器 4 插槽 16 核 插槽 2 线程 核心 Eigen 系列和 C 的使用 以下是代码片段的串行实现 Eigen VectorXd get Row const int j const int
  • 什么是空终止字符串?

    它与什么不同标准 字符串 http www cplusplus com reference string string 字符串 实际上只是一个数组chars 空终止字符串是指其中包含空字符的字符串 0 标记字符串的结尾 不一定是数组的结尾
  • 如何使用 x64 运行 cl?

    我遇到了和这里同样的问题致命错误 C1034 windows h 未设置包含路径 https stackoverflow com questions 931652 fatal error c1034 windows h no include
  • 已发布的 .Net Core 应用程序警告安装 .Net Core,但它已安装

    我制作了一个 WPF 和控制台应用程序 供某人在我无法访问的私人服务器上使用 我使用 Visual Studio 2019 的内置 发布向导 来创建依赖于框架的单文件应用程序 当该人打开 WPF 应用程序时 他们会看到标准警告 他们单击 是
  • 如何递归取消引用指针(C++03)?

    我正在尝试在 C 中递归地取消引用指针 如果传递一个对象 那就是not一个指针 这包括智能指针 我只想返回对象本身 如果可能的话通过引用返回 我有这个代码 template
  • 如果输入被重定向则执行操作

    我想知道如果我的输入被重定向 我应该如何在 C 程序中执行操作 例如 假设我有已编译的程序 prog 并且我将输入 input txt 重定向到它 我这样做 prog lt input txt 我如何在代码中检测到这一点 一般来说 您无法判
  • C++:为什么 numeric_limits 对它不知道的类型起作用?

    我创建了自己的类型 没有任何比较器 也没有专门化std numeric limits 尽管如此 由于某种原因 std numeric limits
  • 在 Win32 控制台应用程序中设置光标位置

    如何在 Win32 控制台应用程序中设置光标位置 最好 我想避免制作句柄并使用 Windows 控制台功能 我花了整个早上沿着那条黑暗的小巷跑 它产生的问题比它解决的问题还要多 我似乎记得当我在大学时使用 stdio 做这件事相对简单 但我
  • 没有“对 *this”功能的右值引用的解决方法

    我有一个围绕可移动对象的代理容器类 并希望代理能够隐式生成对底层对象的右值引用 但仅当代理本身被移动时 我相信我将能够按照提案 n2439 实施此行为 将移动语义扩展到 this http www open std org jtc1 sc2
  • 如何在 sql azure 上运行 aspnet_regsql? [复制]

    这个问题在这里已经有答案了 可能的重复 将 ASP NET 成员资格数据库迁移到 SQL Azure https stackoverflow com questions 10140774 migrating asp net membersh
  • 无法将字符串文字分配给装箱的 std::string 向量

    这是我的类型系统的简化版本 include
  • 为什么空循环使用如此多的处理器时间?

    如果我的代码中有一个空的 while 循环 例如 while true 它将把处理器的使用率提高到大约 25 但是 如果我执行以下操作 while true Sleep 1 它只会使用大约1 那么这是为什么呢 更新 感谢所有精彩的回复 但我
  • 在构建内核模块时为什么需要 /lib/modules? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 在Kbuild树中 当我们编写一个简单的hello ko程序时 为什么我们需要在构建规则中使用 C lib module 为什么需要这样做
  • 如何在 C 中将 char 连接到 char* ?

    我怎样才能前置char c to char myChar 我有c值为 A and myChar值为 LL 我怎样才能前置c to myChar使 ALL 这应该有效 include

随机推荐

  • 使用 Hibernate 持久化长字符串的问题

    在我的 Web 应用程序中 我有一个文本区域 其用户填充的内容最终通过 Hibernate 持久保存到数据库中 我遇到了一个问题 当用户输入超过一定长度时 持久化失败 有没有办法通过 Hibernate Annotations 或在配置中指
  • cpan“Set::IntervalTree”或“Algorithm::ExpectationMaximization”不起作用 - 我在下面解释完整的错误日志

    这里我详细解释一下安装一些 Perl 库时遇到的问题 安装 Set IntervalTree 时遇到问题 我安装了 g 仍然是同样的问题 我安装了 miniconda 并尝试 conda 该包 仍然有同样的问题 这是完整的错误日志 我复制了
  • 禁用 Spring Cloud AWS 自动配置以进行本地开发

    我使用以下 Maven 依赖项 它会自动配置所有必要的参数 使我的项目在 AWS 上运行
  • 从rails日志文件中提取错误信息

    我正在开发 5 个不同的 Rails 项目 另外还重构了一些项目 从旧的 Rails 版本移动到 2 3 从日志文件中提取错误信息的最佳方法是什么 这样我就可以看到所有折旧警告 运行时错误等上 这样我就可以改进代码库了 有没有您可以推荐的服
  • javax.crypto.IllegalBlockSizeException:使用填充密码解密时,输入长度必须是 16 的倍数 [重复]

    这个问题在这里已经有答案了 我在 java 类中遇到解密错误 javax crypto IllegalBlockSizeException Input length must be multiple of 16 when decryptin
  • jQuery 和 PHP 建议答案

    嘿伙计们 有一个表单 用户可以选择他的一些朋友 我很好奇如何实现一个列表 在用户输入朋友的名字时同时进行搜索 当他选择名字时 名字会写在文本框 jQuery 如果用户想要选择多个朋友 当我在数据库中插入姓名时 如何分隔一个输入字段中写入的姓
  • Dart / Flutter:Isolate 顶级函数的异步行为

    哎呀好人 我遇到了奇怪的行为 当异步使用isolate的顶层函数时 你可以找到示例代码HERE https github com iapicca isolates logging 但简而言之 as 隔离的顶级功能这有效 String syn
  • 为什么 Visual Studio 2012 中自动解决冲突默认处于启用状态?

    我们最近安装了 Visual Studio 2012 我正在与我们团队的另一名成员一起开发一个全新的项目 使用 Team Foundation Server 2010 进行源代码控制 我最近注意到我的一些文件在签入时被随机损坏 然后在输出窗
  • Angular 4 延迟加载命名路由器出口不起作用

    我有一个延迟加载的问题 不打算路由到指定的路由器出口 有人可以看看我错在哪里吗 我有一个主页 其中有一个指向 产品 gt 默认路由器出口 和 产品详细信息 gt 命名路由器出口 的链接 div div a Product a div div
  • React 仅在加载时调用一次方法

    我是 Hooks 新手 遇到过一些让我陷入困境的情况 希望有人可以解释或提供对我有意义的解决方案 在组件安装时仅加载一次方法会令人困惑 我尝试了这个方法 有效 但是不明白 谁可以给我解释一下这个 const useMountEffect f
  • POST JSON 失败,并显示 415 不支持的媒体类型,Spring 3 mvc

    我正在尝试向 servlet 发送 POST 请求 请求通过 jQuery 发送 如下所示 var productCategory new Object productCategory idProductCategory 1 product
  • 在 Javascript ECMAScript 6 中从类名创建对象

    我想使用 ES6 创建对象工厂 但旧式语法不适用于新语法 我有下一个代码 export class Column export class Sequence export class Checkbox export class Column
  • 3分钟了解什么是反射?

    许多 Net 面试问题列表 包括好的人 http www hanselman com blog WhatGreatNETDevelopersOughtToKnowMoreNETInterviewQuestions aspx 包含问题 什么是
  • java中的encode(, 'escape') PostgreSQL等效项是什么?

    我有一个 bytea 列存储在 Postgresql 数据库中 列名 测试 Ex x61736461640061736461736400 当我在选择查询中使用encode test escape 时 我得到这样的结果 Ex asdad 00
  • 使用字段重写无参数方法时出现空指针异常

    我正在研究 Scala 中的编程 它说您可以使用字段覆盖无参数方法 广告给出了以下示例 abstract class Element def contents Array String val height Int contents len
  • 使用正则表达式

    这个正则表达式有什么问题 我需要它使 name 仅包含字母数字 现在看来根本不起作用了 if preg match A Za z0 9 name e name must contain only letters or numbers 您需要
  • iPhone-SDK 的最佳 SQLite 3 教程在哪里? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何让我的应用程序使用 Windows 主题?

    我正在使用一些 Windows API 来创建一个小应用程序 我已经创建了按钮 窗口 好吧 但问题是我创建的组件看起来不像操作系统主题 它们看起来很简单 请参阅按钮作为示例 如何启用 Windows 主题 它可以是 C 语言或 Delphi
  • Sprite-Kit 在触摸屏幕时更改节点的图像

    有一个通过点击屏幕来控制的英雄 我希望每次触摸屏幕时英雄看起来都有点不同 我所做的是设置两个略有不同的图像 我希望在发生触摸事件时改变英雄的形象 到目前为止 我设置了一个数组来保存信息 但它有点行不通 NSMutableArray hero
  • 我们可以在 c++ 中使用 POSIX C 库吗?

    我是 Linux 系统编程领域的新手 我目前使用 C 编程 想切换到 C 我们可以在 c 中使用 POSIX C 库中定义的所有函数而不进行任何更改吗 原则您应该能够使用 C 中的任何 C API 该语言包含有利于它的功能 大多数 C 库作