为什么需要头文件?
在编写项目时,为了增加代码的可读性,往往会将主函数和其它功能模块写在不同的cpp文件,为了让编译器在不同的cpp文件中能识别所有的函数名,需要在所有的cpp文件中加入这些函数的声明。如果是这样的话,每写一个新的模块,就要重新声明一遍函数,这显然是重复的劳动。为了提高效率,引入了头文件。
在头文件中可以放入所有函数的声明(只是声明,不需要实体),然后用另一个cpp文件存储所有函数的实体,这样在每个cpp文件的开始部分使用#include就可以将这些声明粘贴到当前的cpp文件中,然后链接器就可以在存储函数实体的cpp文件中找到这些函数的完整定义。
#pragma once
看下面的例子,common.h头文件包含了log.h头文件的内容,有一个cpp文件同时include了common和log两个头文件,这就会导致log.h头文件被引入了两次,会因为结构体变量Player被重复定义而报错。
// log.h
#pragma once
void Log();
void InitLog();
struct Player{};
//common.h
#include "log.h"
#include "common.h"
#include "log.h"
#ifndef
这是早些时候会使用的记法,如果_LOG_H未被定义,那么就会执行define定义_LOG_H, 同时执行下面所用的declaration,反之如果发现_LOG_H已经被定义,那么就不会执行下面的declaration。通过这样的方式也可以避免重复的include
#ifndef _LOG_H
#define _LOG_H
void InitLog();
void Log(const char* message);
struct Player{};
#endif
#include中<>和“”的区别
#include<>: 从系统类库目录查找该文件,一般用于系统头文件
#include"": 从当前的项目文件夹开始查找,一般用于自定义头文件