编写程序重复定义Bug(multiple definition of)解析

如果两个函数、方法重复定义就会报“multiple definition of”错误;如果非要定义两个函数同名,则可以在函数前加static,便可以将两个同名函数编译过。

1、给每一个头文件加条件编译

在编写“.h”头文件时加上条件编译:当多个文件包含同一个头文件时,而头文件没有加上条件编译,编译执行时就会独立的解释,于是就有了重复定义的错误;而如果加上条件编译可避免该文件被多次引用时被多次解释。

#ifndef TEST_H_ 

#define TEST_H_

……

 #endif

2、使用extern定义全局变量

可以把所有的全局变量放入一个头文件(test.h),在每个变量的前边加上extern,在该“.h”文件中,只进行这些变量的声明,而在相对应的“.cpp”文件中(test.cpp)进行声明。在编写程序时让涉及到全局变量的文件 include "test.h"。这样在编译时,会先对test.cpp编译生成一个test.o,然后再和其他文件的.o 链接生成一个可执行文件。

3、采用 static 修饰

在变量前添加static,将其声明为静止变量,该方法可以解决“multiple definition of”的问题,但是存在安全隐患。

例如:file.h、test1.cpp、test2.cpp :这三个文件中,test1.cpp与test2.cpp都include了file.h 。test1.cpp

调用test2.cpp中的函数对file.h中的变量进行了赋值,在此过程中,test1.cpp的file.h中的变量并没有被赋值。

static的含义是使file.h中的变量被某个文件可见。在头文件中定义了static int a; 这个头文件分别被test1.cpp和test2.cpp包含;该变量a 会在test1.cpp和test2.cpp分别定义,这两个a变量是毫无关系的,因此在test2.cpp中修改变量a对于test1.cpp是无影响的。
 

猜你喜欢

转载自blog.csdn.net/u011555996/article/details/129092706