为什么/如何在Visual Studio中默认包含一些C++头文件?

5
在Visual Studio C++中,默认情况下似乎包含了一些头文件。例如,我可以使用std::strncpystd::string而不需要包含<string><cstring>,但如果没有包含<iostream><algorithm>,我则无法使用std::coutstd::min()
然后,当我想在Unix上使用g++编译源代码时,如果我忘记添加Visual Studio没有警告我需要的包含文件,则会出现编译错误。
在Visual Studio中,这些默认包含文件从哪里来?是否有办法在未来和现有项目中取消此行为?注意:我的Visual Studio项目未使用预编译头文件。

1
在标准库中,并没有规定头文件不能包含其它头文件。 - drescherjm
1个回答

7

Visual Studio默认不包含任何头文件。然而,某些头文件包括其他头文件,因此如果你包含<iostream>,在一些编译器中可能会包含<string>,还有许多头文件也包括<cstring>。所以,你可能是意外地自己包含了它们。

哪个头文件包含哪个其他头文件因库而异,因此始终明确地包含该文件使用的头文件。


确实,在msvs上是这种情况。然而,为什么相同的代码在g++中无法编译:error: 'strncpy' is not a member of 'std'。g++和msvs之间的头文件是否不同? - Fehnryr
3
为了使用strncpy函数,你需要在代码中添加#include <cstring>语句。在不同的C++编译环境中,这个头文件可能已经被其他头文件包含进来了,也可能没有。 - doug
5
标准要求某些头文件包含其他头文件,但通常一个头文件会包含一些标准不要求的其他头文件。因此,在不同的编译器上可能会观察到不同的行为。“g++和msvs之间的头文件是否不同?”- 是的,C++标准通常仅规定了标准库的公共接口,实现留给编译器处理。 - eesiraed

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接