我有以下三个文件:
<=>
#ifndef INLINE_HEADER_H
#define INLINE_HEADER_H
inline int func1() {
return 1;
}
#endif
#include "inline_header.h"
当我使用#include "inline_header.h"
int main() {
func1();
}
编译source2.c
时,它会编译。但是,当我尝试使用gcc source2.c
进行编译时,我得到了一个多重定义错误,如下所示:
gcc source1.c source2.c
我正在使用Uccntu 14.04上的gcc 4.8.4进行编译。
我试过这个问题并找到了类似的问题multiple definition of inline function。但是在他的情况下,错误是由他的内联函数的重新定义引起的。就我而言,我没有重新定义它(或者至少没有明确地......)。
答案 0 :(得分:12)
将source1.c编译为source1.o时,它包含int func1();
的定义。同样,当您将source2.c编译为source2.o时,它还包含inline
的定义。因此,当您链接source1.o和source2.o时,会出现多重定义错误。
包含守卫不能防止这种情况的原因是因为source1.c和source2.c都是单独编译的。在单个编译单元中仅包含防护装置。
如果这不是内联函数,您可以在头文件中添加声明:
static
然后将定义放在一个源文件中。
但是,您将该功能定义为var myarrays = [2011, 1, 12, 50, 2011, 2, 13, 80];
data:
(function () {
var data = [];
for (var i = 0; i < myarrays.length; i++)
{
data.push(myarrays[i], myarrays[i + 1], myarrays[i+2], myarrays[i+3]);
i+2;
}
return data;
}())
。因此,您还需要将其声明为[2011, 1, 12, 50]
[2011, 2, 13, 80]
,以便每个编译单元都获得自己的函数副本。
答案 1 :(得分:6)
如果您希望在标题中放置此类函数,则必须为Id32 c14f940e3eed6a3871e1e3376048303f
Id32 4029b601c64a573be83f1114ffee88ac
Id32 6bcd9fe60959a8798af2fea0db163792
Id32 183ad6a4932d1a11016f63fc563b610d
Id32 606e98d6d7a8ee286556e05752f71723
Id32 2086038f425efaeeab7e91904c0a24bc
Id32 5dc0b114317bb9b1250a20275cb5f7a5
:
static
这将使符号对每个编译单元(文件)都是本地的,从而避免任何链接器错误。
另外,来自gcc manual:
当内联函数不是静态的时,编译器必须假设 可能有来自其他源文件的调用;自全球化的象征 在任何程序中只能定义一次,函数不能是 在其他源文件中定义,因此其中的调用不能 集成。因此,始终编译非静态内联函数 以通常的方式独立。