C++ 标准C&x2B+;调用C标准库函数的方法

C++ 标准C&x2B+;调用C标准库函数的方法,c++,c++11,c++-standard-library,C++,C++11,C++ Standard Library,关于在C++中调用C标准库函数,我有几个问题: 如果我想调用中声明的getline(),只包含就足够了吗?这适用于我正在使用的编译器,我看到它在中包含,但我想知道标准是否保证了这一点 是否保证C++标准中所有的C标准库函数?在上面的getline()示例中,我注意到在下,它没有列出getline() 对于std::名称空间中提供的C标准库函数和类型,如FILE或malloc(),通过全局名称空间访问它们是否有问题,或者作为std::FILE或std::malloc()访问它们是否更习惯 您应该始

关于在C++中调用C标准库函数,我有几个问题:

  • 如果我想调用
    中声明的
    getline()
    ,只包含
    就足够了吗?这适用于我正在使用的编译器,我看到它在
    中包含
    ,但我想知道标准是否保证了这一点
  • 是否保证C++标准中所有的C标准库函数?在上面的
    getline()
    示例中,我注意到在
    下,它没有列出
    getline()
  • 对于
    std::
    名称空间中提供的C标准库函数和类型,如
    FILE
    malloc()
    ,通过全局名称空间访问它们是否有问题,或者作为
    std::FILE
    std::malloc()访问它们是否更习惯
  • 您应该始终包括文档告诉您的内容。(编写C++标准库实现时,通常会使函数通过其他include可以访问,但当然,依赖它意味着您的代码不可移植。)请注意,C中没有标准的
    getline
    函数。但C++中有一个函数:

    std::getline()
    
    在标题
    中定义。C++标准并不保证,一般来说,C函数在全局范围内可用,甚至是C++标准库的一部分。这两种语言在许多年前开始分化,因此C++的意义是C语言库的超集,这是一个神话。 参考文献:

    关于#3:

    .h
    库必须将其所有名称放置在全局命名空间中,也可以将它们放置在
    std::
    命名空间中


    <> > <代码> c>代码>起始版本必须将所有的名称放在 STD::/Cord>命名空间中,也可以将它们放在全局命名空间中。

    < P>,一般情况下,任何C库与C++都很容易链接,而不仅仅是标准头。p> 请注意,您可能需要通过man了解引入该方法的unix版本,或者它是否是一个特定的扩展,并自行决定该历史起点是否为您所接受。但是如果你写了一个C程序而不是C++,这是正确的。

    C++别名标头包含了大多数但并非所有来自C标头的功能,但偶尔您可能会发现获得函数的唯一方法是直接包含C头。另一方面,您需要问问自己,为什么他们选择不包括该方法,通常是因为它不推荐、危险或不标准

    因此,它的工作方式是,C函数,包括C库函数,是用
    extern“C”
    关键字引入的

    当包含C头文件时,它们通常会包含一些代码,例如:

    /* C++ needs to know that types and declarations are C, not C++.  */
    #ifdef  __cplusplus
    # define __BEGIN_DECLS  extern "C" {
    # define __END_DECLS    }
    #else
    # define __BEGIN_DECLS
    # define __END_DECLS
    #endif
    
    __BEGIN_DECLS
    
    。。。其中介绍了一节C接口函数

    如果您需要包含一个非常旧的C库,但它没有这样做,那么您可以很容易地在#include:


    您还可以编写与“C”接口兼容的方法。

    getline
    不是C标准库函数,而是POSIX。如果它在C库中是为编译器提供的,它在C++中是可用的。假设你正在考虑,不能保证<> > >代码>将声明它。这可能是,但不能保证,因为它不是标准C++或标准C的一部分。你们是对的,我错过了它是一个POSIX函数,回答了上面的第一个2个问题。结果我指的是POSIX <代码> GETLILE()/<代码> @ @ MalbDNILO指出。关于最后一点,我读过这篇文章,它似乎表明C++标准确实保证了C函数在全局范围内是可用的,如果你包括C标题文件,比如“代码> STDIO。H./CODE >。这是我在之前回答的I链接中所读到的,但是@芭丝谢芭似乎说的是相反的:C++标准不能保证,一般来说,C函数在全局范围内可用
    extern "C" {
    #include "ancientinterface.h"
    };