multipledefinitionof问题解决⽅法
在编写代码时,我想让两个接⼝的函数从公⽤⼀个,现在分为两个来使⽤,但是函数的名字相同,放在两个不同的C⽂件中,
编译后发现,在链接的时候,出现如下错误:
multiple definition of `函数名'
分析是因为两个函数重复定义了,我将每个函数分别加上static后,编译通过。于是上⽹看了下这个问题的其他现象及解决⽅法,参考别⼈,记录如下:
⾸先,最关键的,不要把全局变量以及全局⽅法的定义放在头⽂件⾥!
1.给每⼀个头⽂件加上条件编译:
注:此⽅法不是解决上述问题的⽅法,只是解决multiple definition of的⼀个⽅法。
当多个⽂件包含同⼀个头⽂件时,⽽头⽂件中没有加上条件编译,就会独⽴的解释,然后⽣成每个⽂件⽣成独⽴的标⽰符。在编译器连接时,就会将⼯程中所有的符号整合在⼀起,由于,⽂件中有重名变量,于是就出现了重复定义的错误。
给每⼀个头⽂件加上条件编译,避免该⽂件被多次引⽤时被多次解释,这是个应该是习惯。这个⽅法会解决⼤部分低级问题。
条件编译⽰例
#ifndef TEST_H
#define TEST_H
……
#endif
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;
static修饰的变量在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变化.
上述总结⽅法转⾃:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论