现在我已熟悉C和C标准库,我想知道在以后转向使用C ++时,我对这方面的知识是否有用。
因此,我想知道,我是否可以在C ++设置中使用C标准库提供的功能,以及是否以及为什么实际这样做是有意义的。
答案 0 :(得分:48)
是的,C ++最初的设计使得任何C库都可以在C ++中轻松使用。当然,这稍微不那么真实(特别是,如果C库碰巧使用某些C ++关键字,如try
或dynamic_cast
,它就不会工作;而且,如果{{3}在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标准头文件具有相同的C ++头文件,包含上面的内容(以及namespace std
中的内容)。例如C <stdio.h>
是C ++ <cstdio>
- 但是你经常应该更喜欢真正的C ++流(<iostream>
),但printf
- 就像例程callback友好混合一样与localization。
然而 C和C ++是非常不同的语言。您应该在惯用的C ++ 11中编写代码(使用标准C ++ gettext(3),auto
,containers, closures,RAII,smart pointers,rule of five,SFINAE,exceptions,...)
某些标准C函数在惯用C ++中不是很有用。例如,您不太可能在真正的 C ++中直接使用 malloc
(至少更喜欢new
- 这仍然是非常低的级别而不再是在C ++精神中,更有可能使用很多容器和智能指针而不用手动处理堆分配。但是anonymous functions函数(特别是POSIX ....)在C ++中非常有用。 syscalls(2)可能与C ++异常不兼容。
BTW,C ++在本世纪已经发展了很多。不要学习C ++ 98,但至少longjmp
(它们之间存在巨大的差异)和C++11。使用最近的编译器(C++14或GCC);在2015年12月,这意味着Clang/LLVM至少或GCC 5至少。不要忘记启用所有警告&amp;在编译器中调试信息(例如g++ -Wall -Wextra -g -std=c++11
)
C ++ (这至少意味着C ++ 11)是一种难以编程语言,比C复杂得多。你需要几周的阅读才能学习它,并且良好的编码风格和纪律是必不可少的(你可以在C ++中轻松编写非常糟糕的代码)。从Clang/LLVM 3.7
开始我相信如果你只知道C,那么在学习C ++之前阅读Programming: Principles & Practice Using C++(以及学习一点Scheme)是值得的。
SICP的概念非常重要,无论是在C语言中,还是在C ++中都是如此。你绝对需要理解它(参见C.Lattner的undefined behavior)和blog on it它。
通过研究(并可能有助于)某些现有的avoid及其源代码,您还将学到很多东西。因此我建议使用Linux。
答案 1 :(得分:20)
我只引用ISO / IEC N3690(c ++标准)中的一段。
17.2 C标准库
1 C ++标准库还提供了C标准库的功能,经过适当调整以确保静态类型安全。
简直就是这样!
答案 2 :(得分:0)
是的。您可以在C ++中使用标准c库函数 实例
stdio.h => cstdio (printf/scanf)
math.h => cmath (sqrt)