先看看上一次的文件:
(3条消息) 认真复习c语言1_穿花云烛展的博客-CSDN博客
对于有重复结构体定义但是并不会报错,只是难以修改而已:为了解决这个一改就要改两次的情况,这里有一个解决方案:
上面的代码是可以运行的,和之前的代码的区别就是将人员表函数里面的结构体定义换成了有关这个函数声明和结构体定义的头文件,虽然这样做,这个头文件里的声明对人员表函数没有什么用,但是不会报错;
其实有时候我还是不可以区分之前的两个案例,但是这里有总结啦,可以把它记作规则就行:
//源文件:定义的文件名.c或者c++:包含相关执行功能的函数;
//头文件:定义的文件名.h:包含符号常量,宏函数(这里指的是#define),函数声明,结构声明,类型定义;
在相关函数里面要用到函数的声明或者结构类型的定义,所以要包含头文件,而在主函数里面包含了声明或定义的头文件之后,就可以使用用相关声明或定义的函数了;
最后还再来一个头文件守卫:
如果写代码不小心写了两个引用相同的头文件,就会报错了,这个有时候手抖没办法,但是在错综复杂的文件里面,如果不小心引用了两个文件都包含一个头文件的时候,在编译器预处理之后,就又会出项重复的声明或定义,如果包含的层次更多,就会很难发现错误(比如在一个文件里包含了a,b两个头文件,然后在a头文件又包含了b头文件);那么该怎么解决呢?
可让每个头文件只允许包含一次,为了实现这个功能,就要用到条件编译(暂时没有详细了解),这里只用到它的一个代码:
在每个头文件里面的开头都加上
#ifndef 自己设置的名字(只要不和其他头文件的一样就可以了)
#define 上面设置的名字
中间是头文件里的代码;
#endif
这个有什么作用呢?
首先判断下面宏定义的名字有没有在编译器连接后被重复定义,如果没有就保留这段代码,如果有就删除这段代码,这段代码指的是
#ifndef 自己设置的名字(只要不和其他头文件的一样就可以了)
#define 上面设置的名字
中间是头文件里的代码;
#endif
这一整个;
然后再来个实际的例子,将刚刚写的代码改成这样:
会发现报错:
所以说重复定义是不被允许的,不论是包含main函数的文件,还是其他文件;
然后按照刚刚的办法只需改动头文件:
当然要注意,一般在#后面都不要打分号的;
当然还有一个更简单的方法,就是在头文件的首部放一个
#pragma once
就可以了:
还有个事,虽然说放在首部,但是我放在其他地方都可以正常运行,哪怕放进函数里都可以,但是也有可能只是我的代码比较简单,还是放在首部养成习惯;
当然,第二个方法有些电脑是不支持的,所以两种方法最好都记住;
最后的最后:
既然青春是一场“无论做什么都觉得浪掷”的憾意,何不反过来想想,那么,也几乎等于“无论诚恳地做了什么都不必言悔”。