头文件定义
所有头文件都应该使用 #ifndef来防止头文件被多重包含, 举个例子
写三个文件,main.c head1.h head2.h
main.c
#include <iostream> #include "head1.h" #include "head2.h" using namespace std; int main(){ cout << "Hello World!\n"; return 0; }
head1.h
#ifndef HEAD1_H_ #define HEAD1_H_ int i; #endif // !HEAD_H_
head2.h
#include "head1.h"
运行程序是没有问题的
假如我们将head1.h中的条件定义删掉,就只留下一个变量的声明
head1.h
int i;
执行程序会导致重定义错误
因为我们head2.h包含了#include这个head1.h的头文件,预编译的时候会重复编译这个头文件的内容,因此会导致重定义
HEAD1_H_的命名规则
按照谷歌的代码规范
我们可以将文件路径也加上,其中的’_‘符号没有任何语法意义,加上表示头文件的’.‘符号或者‘/’符号。因为“.”不能作为标识中的字符。
某些资料也说系统自带的头文件会前后各加两个下划线__,用户自己编写的头文件可以不用双下划线__,以表示与系统头文件的区别。看自己习惯。
#pragma once
#pragma once和这种宏实现方式一样,平时使用并没有什么区别
因此我们
head1.h
#pragma once int i;
这么写,我们的程序也是没有问题的。
区别:#ifndef是依赖于我们定义的宏名字不能冲突(如果我们不小心宏名字定义冲突了,over)
#progma once依赖于编译器,同一个文件不会被包含多次(较老的编译器可能会报错)