c++头文件中 #ifndef的作用
避免文件重复处理、变量等重定义
//c1.hpp
#ifndef C1_HPP
#define C1_HPP
int a = 0;
#endif // LFU_CACHE_HPP
#include"c1.hpp"
#ifndef C2_HPP
#define C2_HPP
int b=1;
#endif
#include"c1.hpp"
#include"c2.hpp"
#include<iostream>
int main()
{std::cout<<"this";
}
如果上述三个文件,c1.hpp不写预处理指令,编译会出现redefinition variable a 的错误。就是因为c1.hpp被重复包含了。
当编译器第一次处理这个头文件时,#ifndef SOME_HEADER_FILE_H检查SOME_HEADER_FILE_H这个标识符是否未被定义。由于是第一次处理,这个标识符还未被定义,所以条件为真,编译器会继续处理#define SOME_HEADER_FILE_H这一行,定义了这个标识符。
然后编译器会处理头文件中的实际内容,如类定义、函数声明等。当同一个头文件在其他地方再次被包含时,#ifndef SOME_HEADER_FILE_H检查发现SOME_HEADER_FILE_H这个标识符已经被定义了,所以条件为假,编译器会直接跳过#define和头文件内容部分,直到#endif,这样就避免了头文件内容的重复处理。