multiple definition of(变量或者函数)

今天在公司写项目的时候,遇到如下错误,半个小时了,没看出来问题出在哪里~


我看了好几遍代码,确认没有重定义,后来问旁边的大牛,才发现自己手误,错吧#include “area.h”写成#include"area.c",千万得小心啊·有时候心里想的跟手上写的会不一样哈。


于是写这篇博客以示警戒,并将这类错误的避免方法做以总结。

1,条件编译是个好习惯

#ifndef TEST_H

 ...
#define TEST_H 

...
#endif 
条件编译会独立的解释,然后生成每个文件生成独立的标示符,避免多次解释。在编译器连接时,就会将工程中所有的符号整合在一起,由于,文件中有重名变量,于是就出现了重复定义的错误。

2,变量的唯一

扫描二维码关注公众号,回复: 2774643 查看本文章
 一般在.h文件中定义一个变量声明时,在其他文件中只要包含了这个.h文件,编译的时候就会独立被编译器解释,然后每个.C文件会生成独立的标识符和符号表,所以上述代码在单独编译的时候并不会报错,语法是合法的。但是,最后在编译器链接的时候,就会将工程中所有的符号整合在一起,由于文件中有重复的变量,于是就会出现重复定义的错误,系统就是提示你“multiple definition of `xxx`”。
  进一步解释,我们可以这样想象编译每一个C源文件时,相当于一条有管道包围的纵向水流,二者互不干扰。当链接时两条原本相互独立的水管横向流了,所有就出现了重复的元素。所以当进行链接时就会出现重复定义的标示符。重复定义的标示符在这里只是变量,函数不会。因为函数确实只在.c中定义了一次,多次声明是没有问题的,而变量确实出现了两次定义。两次重复的变量定义链接器就不知道该已那个地址作为变量的内存,所以报错。

  其实只需要将全局变量定义从.h文件中挪到.c文件里,然后在.h文件中用extern做外部声明即可。即在.c文件中声明变量,然后在头文件.h所有的变量声明前加上extern,注意在.h文件中就不要对变量进行初始化赋值了。然后其他需要使用全局变量的.c文件中包含.h文件即可。编译器会为.c生成目标文件,然后链接时,如果该.c文件使用了全局变量,链接器就会链接到此.c文件。其他文件需要使用此全局变量也是同样的方式,目的其实只有一个,就是使变量在内存中唯一化。
3函数的重定义很容易发现
一般函数重定义,编译服务器会报错,很容易解决,如下:

错误提示,row_trp_spc_init函数redefinition。

4,细心检查很重要

项目比较大,文件比较多的时候,会出现循环引用,你包含我 我又包含你的情况,所以得找到最根源的文件,将两者耦合的引用关系分离,在最外层的文件中包含头文件,避免重复引用。

猜你喜欢

转载自blog.csdn.net/Agoni_xiao/article/details/78952623