为什么#endif包含在.h页面的末尾? 代码>在C++ >头文件的开头,在 > IFNDEF 和定义< /代码>之后,是不是很坏的做法?若然,原因为何
没有提到为什么为什么#endif包含在.h页面的末尾? 代码>在C++ >头文件的开头,在 > IFNDEF 和定义< /代码>之后,是不是很坏的做法?若然,原因为何,c++,C++,没有提到为什么#endif在结尾,这正是我在谷歌搜索的目的 比如说 //cDate.h #ifndef CDATE_H_EXISTS #define CDATE_H_EXISTS #include <string> class cDate { private: std::string day; std::string month; std::string year; public: void setDate(std::string, st
#endif
在结尾,这正是我在谷歌搜索的目的
比如说
//cDate.h
#ifndef CDATE_H_EXISTS
#define CDATE_H_EXISTS
#include <string>
class cDate {
private:
std::string day;
std::string month;
std::string year;
public:
void setDate(std::string, std::string, std::string);
std::string getDate(int);
}; // end class def
#endif
//cDate.h
#如果不存在CDATE_H_
#定义CDATE_H_存在
#包括
cDate类{
私人:
标准:字符串日;
std::字符串月份;
std::字符串年;
公众:
void setDate(std::string,std::string,std::string);
std::字符串getDate(int);
}; // 末级def
#恩迪夫
vs
//cDate.h
#如果不存在CDATE_H_
#定义CDATE_H_存在
#恩迪夫
#包括
cDate类{
私人:
标准:字符串日;
std::字符串月份;
std::字符串年;
公众:
void setDate(std::string,std::string,std::string);
std::字符串getDate(int);
}; // 末级def
如果文件已被处理,则需要排除其全部内容
这样做的目的不是定义头部防护罩-这是一个有用的(ish)副作用。目的是确保标题内容只加载一次。第一个示例是
第二个例子,它不是什么卫兵。然而,微妙的是,差别是巨大的。假设将
#endif
放在顶部的#define
语句之后,该定义将完全为空,并且如果存在头文件被多次包含的情况,则该文件仍将被编译,并且会因未定义任何内容而导致问题
相反,假定
#endif
位于最末端,以将定义设置为整个文件及其代码内容,这样,如果包含多次,则不会执行过多的文件 它没有完成它的任务;再次包含此头文件将再次包含所有行
考虑if语句:
if (condition) {
<do something>
}
if(条件){
}
vs
if(条件){
(无效)0;
}
该条件为
#如果未定义,则为初始条件,C++的头文件的开始时,将<代码> > IFIFEF < /COD>预处理器指令的全部目的排除在一起,以避免头文件的内容被多次包含在一起。源文件。可能是@VladK的副本,没问题。我将收回我的接近票。@VladK:这是重复票。头文件末尾的#endif
只是include保护的一部分。这就像问为什么C++的命令必须与关闭的括号匹配。你的答案完全有意义,而且毫无疑问。谢谢你。为那句话推荐一个引文,只是为了让每件事都合乎犹太标准。推荐得好,现在我只是觉得这句话不需要,因为这是一个基本概念。去掉它会使答案更简洁。
if (condition) {
<do something>
}
if (condition) {
(void) 0;
}
<do something>