在#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
答案 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文件及其代码内容,因此如果包含的内容超过一次,该文件都不会被执行过多。