加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 09:57:44 所属栏目:百科 来源:网络整理
导读:我是 Linux系统编程领域的新手.我目前用C编程,想切换到c. 我们可以在c中使用POSIX C库中定义的所有函数而不做任何更改吗? 解决方法 原则上,您应该能够使用C中的任何C API;该语言包含促进它的功能,大多数C库作者都知道人们想要这样做并将采取适当的步骤.对于
我是 Linux系统编程领域的新手.我目前用C编程,想切换到c.

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

解决方法

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

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

> C API头通常会将数百个符号转储到全局命名空间中.其中一些符号可能与C库符号冲突,如果您使用命名空间std会使您遇到麻烦(但您没有这样做,对吧?)
> C API标头经常大量使用宏,包括可能与C库符号冲突的宏名称; std ::不会救你.
>以严格一致性模式编译程序(例如-std = c 11 -D_XOPEN_SOURCE = 700)可能会暴露系统头中的错误.这比C更容易发生.
>少数POSIX API具有异常的控制流行为,可能与C异常和析构函数交互不良,具体取决于C库实现者对于避免问题的彻底程度. setjmp和longjmp显然是一个问题(有没有人做过一个C库,在DWARF风格的异常处理之上实现那些?)但是fork,setcontext和朋友,pthread_cancel,pthread_cleanup_push,以及可能还有其他几个我不能记住我的头顶. (我记得在2004年左右,Ulrich Drepper与海湾合作委员会C大家之间的争论最终是一个巨大的,最终没有结论的关于pthread_cancel在析构函数存在下应该如何表现的原因.)

如果超出POSIX,您可能还会遇到以下问题:

>当编译为C时,不打算将所有声明包装在extern“C”块中的标题,这意味着所有函数名称在它们不应该被破坏时会被破坏,并且链接失败.
>甚至懒得坚持C和C的交叉点的标题.在最坏的情况下,这可能导致在程序运行之前不会出现的故障.最常见的例子是:

>巧妙地使用一些C关键字作为声明名称(例如int模板;)
>假设void *与其他指针类型兼容(例如,不需要转换malloc的结果)
>假设struct foo;没有定义typedef-name foo

请注意,POSIX指定的标头经常包含系统特定的扩展,这些扩展没有像POSIX接口本身那样仔细考虑过.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读