#ifndef
和 #define
以及#endif 是C/C++中的预处理指令,用于防止头文件(header file)被重复包含(inclusion)导致的编译错误。这种技术通常被称为“头文件保护”或“包含卫士”(Include Guards)。
通俗理解
通俗的方式来解释#ifndef SSH_H
、#define SSH_H
和#endif
这组预处理指令。
想象一下你正在写一个故事书,这本书里有很多章节,每个章节都描述了不同的场景和角色。但是,你不想让读者重复读到同一个章节的内容,因为这会让故事变得无聊和混乱。
在编程中,头文件(header file)就像是这些章节,它们包含了函数声明、变量定义、宏定义等“故事元素”。当你编写一个大型项目时,可能会在不同的文件中多次包含同一个头文件,这就像是让读者多次读同一个章节一样,会导致问题。
现在,#ifndef SSH_H
、#define SSH_H
和#endif
就像是你在书中的一个特殊标记,用来确保读者(或编译器)不会重复读到同一个章节(或头文件的内容)。
-
#ifndef SSH_H
:这就像是你在章节开始处放了一个标记,上面写着“如果读者还没读过这个章节(即SSH_H这个标记还没被定义),那就让他继续读下去”。 -
#define SSH_H
:这表示你已经让读者开始读这个章节了,并且为了防止他再次读到这个章节,你在这章的开头放了一个“已读”标记(即定义了SSH_H)。 -
#endif
:这表示章节的结束,以及“已读”标记的范围。从#ifndef
到#endif
之间的内容,只有在章节还没被读过(即SSH_H还没被定义)时,读者才会读到。
所以,当你在编程中看到这样的代码时,就可以理解为:“如果SSH_H这个标记还没被定义(即这个头文件还没被包含过),那么就定义它,并包含这个头文件的内容;如果已经定义过了(即已经包含过了),那么就跳过这部分内容,避免重复包含。”
这样,就可以确保你的项目中每个头文件只被包含一次,避免了重复定义和编译错误。
具体定义
1.#ifndef SSH_H
这行代码的意思是“如果没有定义SSH_H”。#ifndef
是预处理指令 if not defined
的缩写。它检查宏(macro)SSH_H
是否已经定义。如果 SSH_H
没有被定义,那么编译器就会执行紧接着 #ifndef
和 #endif
之间的代码。
2.#define SSH_H
这行代码定义了宏 SSH_H
。如果 #ifndef SSH_H
的条件为真(即 SSH_H
没有被定义),那么这行代码就会被执行,SSH_H
宏就会被定义。这样,如果再次包含这个头文件,#ifndef SSH_H
的条件就会为假(因为 SSH_H
已经被定义了),从而避免了头文件内容的重复包含。
3.#endif
这行代码标记了 #ifndef
条件块的结束。它告诉编译器结束检查条件,并继续处理后面的代码。