在最近的项目里,因为我想重载结构体的==操做符,然而大意的我把重载的过程写在了头文件里,因此致使了multiple definition of的错误。如今总结下解决方法:函数
首先,最关键的,不要把全局变量以及全局方法的定义放在头文件里!!!!spa
1.给每个头文件加上条件编译:
注:此方法不是解决上述问题的方法,只是解决multiple definition of的一个方法。
当多个文件包含同一个头文件时,而头文件中没有加上条件编译,就会独立的解释,而后生成每一个文件生成独立的标示符。在编译器链接时,就会将工程中全部的符号整合在一块儿,因为,文件中有重名变量,因而就出现了重复定义的错误。
给每个头文件加上条件编译,避免该文件被屡次引用时被屡次解释,这是个应该是习惯。这个方法会解决大部分低级问题。
条件编译示例
#ifndef TEST_H
#define TEST_H
……
#endifip
2.使用extern定义全局变量:
能够把全部的全局变量放入一个头文件 global.h (名字随意起,但要加条件编译)中,每个变量前面加extern,声明一下这些变量将在其它文件中定义。 而后创建一个和头文件名字对应的.c or .cpp文件 如global.c。在里面声明全部的全局变量。例如:void(*Handl_Display)();
而后,让涉及到全局变量的文件include ”global.h“。这样编译时,会先对global.c编译生成一个global.o ,而后再和其它文件的.o连接生成可执行文件。
简单一点说,就是在变量前加extern,以后变量的声明放在.c中。编译器
3.使用Static修饰:
在变量前加static,声明成静止变量。
这个方法虽然能够解决multiple definition的问题,可是却会引起其余问题。
问题以下:
三个文件,a.h,a.c,b.c;
在a.c和b.c 都include了a.h。
在b.c中调用a.c中的函数对a.h中的变量进行赋值,但事实上b.c中的变量仍没被赋值。
问题分析:
static的含义是迫使那个变量只在某个文件可见。
假定你在头文件定义static x;
且这个头文件分别被a.c和b.c包含;
实质是在a.c和b.c里会分别定义一个名字叫x的变量,两个x毫无关系。
在a.c里修改x,他不会致使b.c里的x变化.it