gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 12:42:31 25 4
gpt4 key购买 nike

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

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

最佳答案

是的,C++ 最初的设计目的是让任何 C 库都可以在 C++ 中轻松使用。当然,这不太正确(特别是,如果 C 库碰巧使用了一些 C++ 关键字,例如 trydynamic_cast ,它将不起作用;另外,如果用 C++ 编码的 callback 传递给 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 类例程通常更 localizationgettext(3) 混合使用。

However C and C++ are very different languages. You should code in idiomatic C++11 (using standard C++ containers , auto , closures , RAII , smart pointers , rule of five , SFINAE , exceptions , anonymous functions , ...)

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

顺便说一句,C++ 在本世纪已经发展了很多。不要学习 C++98,但至少要学习 C++11 (它们之间存在 巨大 差异),也许还有 C++14 。使用 recent 编译器(GCCClang/LLVM);在 2015 年 12 月,这意味着至少 GCC 5 或至少 Clang/LLVM 3.7。不要忘记在编译器中启用所有警告和调试信息(例如 g++ -Wall -Wextra -g -std=c++11 )

C++(至少意味着 C++11)是一种困难编程语言,比 C 复杂得多。您需要数周的阅读时间来学习其中的一些内容,并且良好的编码风格和纪律是必不可少的(您可以轻松地用 C++ 编写非常糟糕的代码)。以 Programming: Principles & Practice Using C++ 开头

我相信如果你只会 C,那么在学习 C++ 之前阅读 SICP(并学习一点 Scheme) 是值得的。

undefined behavior 的概念在 C 中非常重要,在 C++ 中可能更是如此。您绝对需要了解它(参见 C.Lattner 的 blog on it )和 avoid 它。

您还将通过研究(或许还可以贡献)一些现有的 free software 及其源代码来学到很多东西。因此我推荐使用 Linux。

关于c++ - C 标准库中的函数可以在 C++ 中使用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34307731/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com