我对在C ++中调用C标准库函数有一些疑问:
getline()
中声明的<stdio.h>
,仅包含<cstdio>
总是足够的吗?这可以与我使用的编译器一起使用,并且我发现它在<stdio.h>
中包含<cstdio>
,但是我想知道标准是否可以保证这一点。getline()
示例中,我注意到<cstdio>
下的cppreference上没有列出getline()
。std::
命名空间(如FILE
或malloc()
中提供的C标准库函数和类型,它们是否通过全局命名空间访问它们是否存在任何问题,还是更多?习惯以std::FILE
或std::malloc()
的身份访问它们吗?答案 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”接口兼容的方法。