C++ 标准C&x2B+;调用C标准库函数的方法
关于在C++中调用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()访问它们是否更习惯 您应该始
中声明的getline()
,只包含
就足够了吗?这适用于我正在使用的编译器,我看到它在
中包含
,但我想知道标准是否保证了这一点getline()
示例中,我注意到在
下,它没有列出getline()
std::
名称空间中提供的C标准库函数和类型,如FILE
或malloc()
,通过全局名称空间访问它们是否有问题,或者作为std::FILE
或std::malloc()访问它们是否更习惯
getline
函数。但C++中有一个函数:
std::getline()
在标题
中定义。C++标准并不保证,一般来说,C函数在全局范围内可用,甚至是C++标准库的一部分。这两种语言在许多年前开始分化,因此C++的意义是C语言库的超集,这是一个神话。
参考文献:关于#3:
.h
库必须将其所有名称放置在全局命名空间中,也可以将它们放置在std::
命名空间中
<> > <代码> 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"
};