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

时间:2015-12-16 09:03:05

标签: c++ c language-interoperability

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

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

3 个答案:

答案 0 :(得分:48)

是的,C ++最初的设计使得任何C库都可以在C ++中轻松使用。当然,这稍微不那么真实(特别是,如果C库碰巧使用某些C ++关键字,如trydynamic_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)autocontainersclosuresRAIIsmart pointersrule of fiveSFINAEexceptions,...)

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

BTW,C ++在本世纪已经发展了很多。不要学习C ++ 98,但至少longjmp(它们之间存在巨大的差异)和C++11。使用最近的编译器(C++14GCC);在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)