C中的重复符号错误

时间:2014-06-10 14:59:19

标签: c duplicate-symbol

我有以下代码布局

header.h

#ifndef _header_h
#define _header_h
void empty(float *array, int l)
{
    int i;
    for (i=1 ; i<=l ; i++)
    {
        array[i]=0;
    }

}

#endif

和两个文件(让我们称之为file1.c和file2.c)

#include "header.h"

void function/*1 or 2*/(){

     ....
     empty(a,b);
     ....
}

所以编译工作正常,但链接器命令失败,因为编译器说有一个重复的函数定义。如何在仍然使用头文件的情况下避免这种情况?当我只在头文件中定义函数并创建另一个包含完整函数的.c文件时,它工作正常。我一直认为在标题中声明它是要走的路。

3 个答案:

答案 0 :(得分:4)

  

我一直认为在标题中声明它是要走的路。

是的,确实如此。 在标题中声明它很好。但是,在标题中定义没有任何好处。 (除非它是static inline,但你现在可能不想这样做。)

答案 1 :(得分:3)

你应该永远不会在正在运行的程序中需要内存的标题中。这是一种粗略的指定方式,但在实践中效果很好。

换句话说,标题应该只包含函数的原型,这是一个编译时间不存在的函数&#34;在正在运行的程序中(与函数本身的代码不同,当然在运行时存在):

void empty(float *array, int l);

然后将代码放在一个单独的C文件中,您可以单独编译和链接。

答案 2 :(得分:1)

您在标题中将函数empty定义为全局符号。这意味着它将是包含它的所有编译单元中的可见符号。有三种常见的解决方法:

  1. 使其成为静态函数

    static void empty(...) {...}
    
  2. 将实现放入单独的编译单元

    header.h中的

    void empty(float *array, int l);
    

    empty.c中实施

  3. 指示您的链接器忽略重复的符号。这与链接器不同,请参阅man ld

    在OS X上:-m标志。

    在Linux上:-z muldefs