繁体   English   中英

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

[英]Can functions from the C standard library be used in C++?

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

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

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

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

 extern "C" {
 #include <some_c_header_file.h>
 };

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

 #ifdef __cplusplus
 extern "C" {
 #endif

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

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

在实践中,许多C标准头文件具有包含上述内容(以及namespace std )的等效C ++头文件。 例如C <stdio.h>是C ++ <cstdio> - 但是你经常应该更喜欢真正的C ++流( <iostream> ),但是printf的例程通常更加本地化,并且与gettext(3)混合在一起。

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

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

BTW,C ++在本世纪已经发展了很多 不要学习C ++ 98,但至少要学习C ++ 11 (它们之间存在巨大的差异),也许是C ++ 14 使用最近的编译器( GCCClang / 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。

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

17.2 C标准库

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

所以简单地说是!

是的。您可以在C ++示例中使用标准c库函数

    stdio.h   => cstdio   (printf/scanf)
    math.h    => cmath     (sqrt)  

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM