为什么#endif包含在.h页面的末尾?

时间:2016-02-19 01:19:29

标签: c++

#endif#ifndef之后将#define放在c ++头文件的开头是不好的做法?如果是这样,为什么?

This question没有触及为什么#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

vs

 //cDate.h
    #ifndef CDATE_H_EXISTS
    #define CDATE_H_EXISTS
    #endif

    #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

4 个答案:

答案 0 :(得分:7)

第一个例子,它是include guard

第二个例子,它是 nothing-guard。

答案 1 :(得分:3)

它没有完成任务;再次包括此头文件将再次包含所有行。

考虑if语句:

if (condition) {
    <do something>
}

VS

if (condition) {
    (void) 0;
}
<do something>

条件是#ifndef(如果没有定义),左括号是初始条件,右括号是#endif

答案 2 :(得分:1)

如果文件已经处理,则需要排除该文件的全部内容。

目的不是#define标题保护 - 这是一个有用的(ish)副作用。目的是确保标题内容仅加载一次。

答案 3 :(得分:1)

虽然微妙,但差异很大。假设您在#endif语句后面的#define位于顶部,那么该定义将完全为空,如果您的头文件被多次包含,则该文件仍然会被编译并导致问题,因为没有定义。

一旦反面,#endif 假设最终将定义设置为ENTIRE文件及其代码内容,因此如果包含的内容超过一次,该文件都不会被执行过多。