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

时间:2019-01-16 08:37:12

标签: c++ c++11 c++-standard-library

我对在C ++中调用C标准库函数有一些疑问:

  1. 如果我要调用getline()中声明的<stdio.h>,仅包含<cstdio>总是足够的吗?这可以与我使用的编译器一起使用,并且我发现它在<stdio.h>中包含<cstdio>,但是我想知道标准是否可以保证这一点。
  2. 是否所有C标准库函数都保证可以在C ++中使用?在上面的getline()示例中,我注意到<cstdio>下的cppreference上没有列出getline()
  3. 对于std::命名空间(如FILEmalloc()中提供的C标准库函数和类型,它们是否通过全局命名空间访问它们是否存在任何问题,还是更多?习惯以std::FILEstd::malloc()的身份访问它们吗?

3 个答案:

答案 0 :(得分:4)

您应该始终包括文档中告诉您的内容。 (通常会编写C ++标准库实现,以便可以通过其他include来访问函数,但是当然依赖于它意味着代码不可移植。)请注意,没有 standard getline函数在C中。但是在C ++中有一个:

std::getline()

在头文件<string>中定义。通常,C ++标准不能保证C函数在全局范围内可用,甚至不属于C ++标准库的一部分。两种语言在很多年前就开始出现分歧,因此从某种意义上说C ++是C的超集(包括库)是一个神话。

参考:https://en.cppreference.com/w/cpp/string/basic_string/getline

答案 1 :(得分:2)

关于#3

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

c开头的版本必须将其所有名称放置在std::命名空间中,也可以将它们放置在全局命名空间中。

答案 2 :(得分:0)

一般来说,将任何C库与C ++链接起来都应该很容易,而不仅仅是标准头文件。

请注意,您可能必须四处搜寻,以找出引入该方法的Unix版本或该方法是否是特定扩展名,并自己确定该历史起点是否可以接受。但是,如果您编写的是C程序而不是C ++,这是真的。

C ++别名头包含C头中的大多数功能,但不是全部功能,但是偶尔您会发现获得函数的唯一方法是直接包含C头。另一方面,您需要问自己为什么他们选择不包括该方法,通常是因为该方法已过时,危险或不标准。

所以它的工作方式是使用extern "C"关键字引入C函数,包括C库函数。

当您#include 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周围轻松添加extern "C"

extern "C" {
#include "ancientinterface.h"
};

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