Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么#endif包含在.h页面的末尾? 代码>在C++ >头文件的开头,在 > IFNDEF 和定义< /代码>之后,是不是很坏的做法?若然,原因为何_C++ - Fatal编程技术网

为什么#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>