这两天做项目的时候,程序上遇到一个问题,困扰了我很长时间,关于关键字重定义的问题。
我在一个包含了所有头文件的总头文件里面重定义了关键字,但是运行的时候还是报错,当我在这个报错的头文件里面在写一次关键字的重定义的时候,就没有了错误,但是这不就是两次写了相同的内容了吗?所以这不是解决问题的最终手段,一定还有其他问题没有注意到。
分析错误列表 发现,他说在byte_1附近有语法错误,就是uchar无法识别,再往上面看,他是在main.c文件里运行时发生的错误,所以我们打开main文件,看看到底是哪里的错误。
在main文件里面,能运行到当前位置的只有头文件的包含 ,#include "MAIN.h",在main文件的第一行我包含了这个总的头文件,然后这个总的头文件又包含了其他所有的头文件。
所以只可能是在包含这个头文件里面发生了错误。因为包含一个头文件就相当于把这个头文件里面的内容复制粘贴过来。打开总的头文件看看到底是哪里的错误。
//总头文件 #ifndef __MAIN_H #define __MAIN_H #include "reg52.h" #include "intrins.h" #include "DS1302.h" #include "tft.h" #include "key.h" #include "temp.h" #include "modle.h"//ASCII码字模 //---重定义关键词---// #ifndef uchar #define uchar unsigned char //无符号字符型,占6个比特,最大表示255 #endif #ifndef uint #define uint unsigned int //无符号整形,占16个比特,最大表示65535 #endif #endif
上面就是我的总的头文件的内容。一步一步的来看,它先是包含了所有的头文件,而包含一个头文件相当于把头文件里面的内容复制过来,所以我们可以想象一下,当把这所有的头文件复制过来的时候,其他的头文件里面声明了很多函数,而声明这些函数的时候,有的用到了 ucahr和uint,就是我们在下面重定义的关键字。虽然我们在下面重定义了这些关键字,但是是在使用之后定义的。相当于犯了先使用后定义的错误,所以无法识别。
到此,错误找到了,也就是说,把头文件的包含移到关键字的重定义后面就可以了,
果然,当把重定义关键字写在包含的头文件前面的时候,错误没有了。
一个简简单单的前后顺序关系,竟然这么大讲究,看来真是不细心不行啊。注意包含头文件的顺序。
还有就是可以新建一个头文件,单独把你经常用到的一些重定义的关键子写在里面,当其他时候你要用到的时候,直接包含这个头文件
就可以了。但还是要注意包含的顺序问题。