现在我已经熟悉了C和C标准库,我想知道当我转向以后使用C++时,我在这方面的知识是否有用.
因此,我想知道,我是否可以在C++设置中使用C标准库提供的功能,以及是否以及为什么实际这样做是有意义的.
是的,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.
我将引用ISO/IEC N3690(c ++标准)中的一段.
17.2 C标准库
1 C++标准库还提供了C标准库的功能,经过适当调整以确保静态类型安全.
所以简单地说是!