#ifndef, #endif的作用是用于C++的预处理指令,用于实现头文件的防止重复包含(Include Guard)。它们的主要作用是确保一个头文件不会被多次包含,从而避免重复定义。
原理:
当一个头文件被多次包含时,如果没有进行保护,可能会出现重复定义错误。例如如下代码在编译中会报错:
//file1.h
class MyClass{
int x;
};
//main.cpp
#include "file1.h"
#include "file1.h"
编译器就会报错,因为重复定义了MyClass
而#ifndef和#endif就正是为了解决这个问题
用法:
在头文件中使用#ifndef,#define和#endif来包围代码:
#ifndef FILE1_H
#define FILE1_H
class MyClass{
int x;
};
#endif
执行过程:
1.第一次包含的时候预处理器会检查FILE1_H是否为被定义,然后定义该头文件。
2.之后包含的时候预处理器发现该头文件已定义,跳过头文件内容。
替代方法:
#pragma once
在GCC,Clang编译器中,还可以使用#pragama once用于防止头文件重复包含。但虽然它更简洁,但是它是非标准的,所以跨平台时还是建议使用#ifndef和#endif