C++ C++;:如果我包含多个头文件,如果两者都有#include<;字符串>;?

C++ C++;:如果我包含多个头文件,如果两者都有#include<;字符串>;?,c++,class,C++,Class,我正试图写我自己的小“游戏”,这就是为什么我开始自己编程。但是,使用多个头文件来声明单独的.cpp使用的多个类时,我遇到了一个问题:如果我将#包含到每个头文件中,并将这些头文件中的多个包含到单个.cpp中,以后会不会造成任何伤害? 例如: //a.cpp #include "x.h" #include "y.h" int main(){blablabla} //x.h #ifndef XCLASS_H #define XCLASS_H #include <string> class

我正试图写我自己的小“游戏”,这就是为什么我开始自己编程。但是,使用多个头文件来声明单独的.cpp使用的多个类时,我遇到了一个问题:如果我将
#包含到每个头文件中,并将这些头文件中的多个包含到单个.cpp中,以后会不会造成任何伤害?
例如:

//a.cpp
#include "x.h"
#include "y.h"
int main(){blablabla}

//x.h
#ifndef XCLASS_H #define XCLASS_H
#include <string>
class xclass{std::string xstring;};
#endif

//y.h
#ifndef YCLASS_H #define YCLASS_H
#include <string>
class yclass{std::string ystring;};
#endif
//a.cpp
#包括“x.h”
#包括“y.h”
int main(){blabla}
//x、 h
#如果ndef XCLASS_H#定义XCLASS_H
#包括
类xclass{std::string xstring;};
#恩迪夫
//y、 h
#如果未定义YCLASS#H,则定义YCLASS#H
#包括
类yclass{std::string ystring;};
#恩迪夫

据我所知,两者都包括a.cpp。当我尝试时,程序运行良好,没有任何错误。我正在使用Visual Studio 2012。这会在其他计算机上引起问题吗?如果会,我如何避免这些问题?

您可以在每个翻译单元中包含标准页眉,无论需要多少次

通常,第一个夹杂物之后的后续夹杂物不会产生任何影响

一个例外是
头,它定义了
断言
宏。根据每次包含的符号
NDEBUG
,此标题可以不同地定义
assert
。因为这有点不寻常,标准明确指出了这一点


标准语:

C++11§17.6.22/2[使用.headers]

翻译单元可以包括任何顺序的库头(第2条)。每一项可包括超过 一次,与仅包含一次没有不同的效果,但包含其中任何一项的效果除外
每次都取决于
NDEBUG
的当前词汇定义


您可以在每个翻译单元中包含任意次数的标准标题

通常,第一个夹杂物之后的后续夹杂物不会产生任何影响

一个例外是
头,它定义了
断言
宏。根据每次包含的符号
NDEBUG
,此标题可以不同地定义
assert
。因为这有点不寻常,标准明确指出了这一点


标准语:

C++11§17.6.22/2[使用.headers]

翻译单元可以包括任何顺序的库头(第2条)。每一项可包括超过 一次,与仅包含一次没有不同的效果,但包含其中任何一项的效果除外
每次都取决于
NDEBUG
的当前词汇定义


不。他们有头球后卫,特别是。@Cheersandhth.-Alf是的,它不脏,但不标准。IBM编译器不支持它,GCC把它列在不推荐使用的列表中,等等@Cheersandhth.-Alf哦,传统的防护并没有那么多工作。Pragma曾经是一行,而传统的是三行。@BWG:我想你把我错当成KvB了。总之,有些编译器并没有真正支持C++,AIX也在这个列表中。避免这些问题是个好主意,让他们来指导或者影响你的C++编码不是一个好主意。i、 e.
#pragma once
将为您节省大量工作,除非您选择进行泥地摔跤。@doc
#pragma once
在GCC 3.2中曾一度被弃用,因为它是非标准的,实现得很差,但后来被弃用,因为它是一个事实上的标准,并且实现是固定的。没有计划放弃对GCC.Nope的支持。他们有头球后卫,特别是。@Cheersandhth.-Alf是的,它不脏,但不标准。IBM编译器不支持它,GCC把它列在不推荐使用的列表中,等等@Cheersandhth.-Alf哦,传统的防护并没有那么多工作。Pragma曾经是一行,而传统的是三行。@BWG:我想你把我错当成KvB了。总之,有些编译器并没有真正支持C++,AIX也在这个列表中。避免这些问题是个好主意,让他们来指导或者影响你的C++编码不是一个好主意。i、 e.
#pragma once
将为您节省大量工作,除非您选择进行泥地摔跤。@doc
#pragma once
在GCC 3.2中曾一度被弃用,因为它是非标准的,实现得很差,但后来被弃用,因为它是一个事实上的标准,并且实现是固定的。没有放弃GCC支持的计划。