现在我正在熟悉 C 和 C 标准库,我想知道我在这方面的知识在以后转向使用 C++ 时是否有用。
因此,我想知道,我是否可以在 C++ 设置中使用 C 标准库提供的函数,以及实际这样做是否有意义以及为什么有意义。
现在我正在熟悉 C 和 C 标准库,我想知道我在这方面的知识在以后转向使用 C++ 时是否有用。
因此,我想知道,我是否可以在 C++ 设置中使用 C 标准库提供的函数,以及实际这样做是否有意义以及为什么有意义。
是的,C++ 最初的设计目的是让任何 C 库都可以在 C++ 中轻松使用。当然,这有点不太正确(特别是,如果 C 库碰巧使用了一些 C++ 关键字,例如try
or dynamic_cast
,它将不起作用;此外,如果用 C++ 编码的回调传递给 C 库引发了一些异常,那么您就是可能会有很大的混乱)。
在 C++ 中使用 C 头文件的标准做法是
extern "C" {
#include <some_c_header_file.h>
};
并且大多数现有的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>
),然而- 与gettext(3)混合的printf
类似例程通常更适合本地化。
但是C 和 C++ 是非常不同的语言。您应该使用惯用的 C++11 进行编码(使用标准 C++容器、、闭包auto
、RAII、智能指针、五规则、SFINAE、异常、匿名函数…… )
一些标准的 C 函数在惯用的 C++ 中不是很有用。例如,您不太可能直接 malloc
在真正的C++ 中使用(至少更喜欢new
- 这仍然是非常低级的并且不再具有 C++ 精神 - 更有可能使用大量容器和智能指针而不手动处理堆分配) . 但是POSIX函数(尤其是syscalls(2) ....)在 C++ 中非常有用。longjmp
可能与 C++ 异常不兼容。
顺便说一句,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)