[英]Can functions from the C standard library be used in C++?
现在我已经熟悉了C和C标准库,我想知道当我转向以后使用C ++时,我在这方面的知识是否有用。
因此,我想知道,我是否可以在C ++设置中使用C标准库提供的功能,以及是否以及为什么实际这样做是有意义的。
是的,C ++最初的设计使得任何C库都可以在C ++中轻松使用。 当然,这稍微不那么真实(特别是,如果C库碰巧使用某些C ++关键字,如try
或dynamic_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 。 使用最近的编译器( 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。
我将引用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.