内联函数多重定义

时间:2016-01-25 16:45:58

标签: c gcc inline

我有以下三个文件:

inline_header.h

<=>

source1.c

#ifndef INLINE_HEADER_H
#define INLINE_HEADER_H

inline int func1() {
    return 1;
}

#endif

source2.c

#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。但是在他的情况下,错误是由他的内联函数的重新定义引起的。就我而言,我没有重新定义它(或者至少没有明确地......)。

2 个答案:

答案 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

  

当内联函数不是静态的时,编译器必须假设   可能有来自其他源文件的调用;自全球化的象征   在任何程序中只能定义一次,函数不能是   在其他源文件中定义,因此其中的调用不能   集成。因此,始终编译非静态内联函数   以通常的方式独立。