当前位置:  开发笔记 > 编程语言 > 正文

可以在C++中使用C标准库中的函数吗?

如何解决《可以在C++中使用C标准库中的函数吗?》经验,为你挑选了2个好方法。

现在我已经熟悉了C和C标准库,我想知道当我转向以后使用C++时,我在这方面的知识是否有用.

因此,我想知道,我是否可以在C++设置中使用C标准库提供的功能,以及是否以及为什么实际这样做是有意义的.



1> Basile Stary..:

是的,C++最初的设计使得任何C库都可以在C++中轻松使用.当然这稍微不那么真实(特别是,如果C库碰巧使用某些C++关键字,try或者dynamic_cast它将无法工作;另外,如果传递给C库的C++编码的回调引发了一些异常,那么可能会有一个大混乱).

在C++中使用C头文件的标准做法是

 extern "C" {
 #include 
 };

并且大多数现有的 C头文件都是通过实际包含类似的东西来与C++合作的

 #ifdef __cplusplus
 extern "C" {
 #endif

 //// most of the header material goes here, C style

 #ifdef __cplusplus
 }; // end extern "C"
 #endif

实际上,许多C标准头文件具有相同的C++头文件,包含上述内容(以及内容namespace std).例如C 是C++ - 但是你经常应该更喜欢真正的C++流(),但是printf类似的例程通常更加本地化,并且与gettext(3)混合在一起.

但是C和C++是非常不同的语言.你应该在代码中惯用的C++ 11(使用标准C++ 容器,auto,关闭,RAII,智能指针,五个规则,SFINAE,例外,匿名函数,...)

某些标准C函数在惯用C++中不是很有用.例如,你不太可能直接 malloc真正的 C++中使用(至少更喜欢new- 它仍然是非常低级别而不再是C++精神 - 更可能使用很多容器和智能指针而不用手动处理堆分配) .但是POSIX函数(特别是syscalls(2) ....)在C++中非常有用.longjmp可能与C++异常不兼容.

BTW,C++ 在本世纪已经发生了很多变化.不要学习C++ 98,但至少要学习C++ 11(它们之间存在巨大的差异),也许是C++ 14.使用最近的编译器(GCC或Clang/LLVM); 在2015年12月,这意味着至少GCC 5或至少Clang/LLVM 3.7.不要忘记在编译器中启用所有警告和调试信息(例如g++ -Wall -Wextra -g -std=c++11)

C++(至少意味着C++ 11)是一种难以编程的语言,比C 语言复杂得多.你需要几周的阅读才能学习它,并且良好的编码风格和纪律是必不可少的(你可以在C++中轻松编写非常糟糕的代码).从编程开始:使用C++的原理和实践

我相信如果你只知道C,那么学习C++ 之前阅读SICP(并研究一下Scheme)是值得的.

未定义行为的概念非常重要,无论是在C语言中还是在C++中甚至更多.你绝对需要理解它(参见C.Lattner 关于它的博客)并避免它.

通过研究(也许可以贡献)一些现有的自由软件及其源代码,您还将学到很多东西.因此我推荐使用Linux.


我不会太习惯于写出惯用的C++:做任何最简单的事情*.所有其他问题都是次要的.对我来说,这意味着我倾向于在C++ iostream上使用`printf()`函数系列,因为使用`cout`进行正确的格式化是PITA,而C版本通常是非常易读和直接的.
@Claudio C++对应物主要用于将符号插入`std ::`命名空间,而不是添加`extern"C"{'.至少在我的机器上,它可以很好地直接包含所有C标准头文件,将符号插入全局命名空间.
@BasileStarynkevitch:我不确定推荐自由软件是非常有用的.由于各种原因(年龄,与多个/旧编译器的兼容性,贡献者对C++本身缺乏经验,......),大多数免费软件代码实际上都是相当残酷的.
我更多地考虑容器,智能指针而不是流

2> dhein..:

我将引用ISO/IEC N3690(c ++标准)中的一段.

17.2 C标准库

1 C++标准库还提供了C标准库的功能,经过适当调整以确保静态类型安全.

所以简单地说是!

推荐阅读
可爱的天使keven_464
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有