我有点了解#define指令的作用及其便利性,但是在诸如此类的类上使用它时,这意味着什么?
#ifndef SAVINGS_H
#define SAVINGS_H
#include "account.h"
class Savings
{
protected:
public:
};
#endif
如果未定义SAVINGS_H,则它定义SAVINGS_H,但SAVINGS_H曾在哪里使用?为什么在所有大写字母中都将该类称为SAVINGS_H?
我知道您定义
之类的变量时#define num 1
int arr[num]
num被替换为1,但是对于我的问题,程序中的其他任何地方都没有使用SAVINGS_H
答案 0 :(得分:2)
如果您的源代码(通过任何路径)执行了此操作:
#include "savings.h"
#include "savings.h"
然后在第一个SAVINGS_H
之后定义#include
,这将阻止重新定义savings.h
头文件中的名称。这就是所谓的“包含保护”,它可以防止在同一翻译单元的头文件中重新定义名称。
答案 1 :(得分:1)
这就是所谓的Include Guard。这样一来,您的标头仅包含一次(以避免违反ODR,即同一实体的多个定义)。
例如,如果A
包含B
和C
,但是B
也包含C
。
它们基本上是这样工作的:当编译器第一次包含头文件时,它定义了include保护宏。在所有后续包含中,由于已经定义了宏(ifndef),因此它仅跳过文件内容。
答案 2 :(得分:1)
查找“标题保护”(又称为“包含保护”)。
目的是防止头文件的多次包含(包括多次传递包含)。这将导致多次定义同一类型的问题。