我有以下代码布局
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文件时,它工作正常。我一直认为在标题中声明它是要走的路。
答案 0 :(得分:4)
我一直认为在标题中声明它是要走的路。
是的,确实如此。 在标题中声明它很好。但是,在标题中定义没有任何好处。 (除非它是static inline
,但你现在可能不想这样做。)
答案 1 :(得分:3)
你应该永远不会在正在运行的程序中需要内存的标题中。这是一种粗略的指定方式,但在实践中效果很好。
换句话说,标题应该只包含函数的原型,这是一个编译时间不存在的函数&#34;在正在运行的程序中(与函数本身的代码不同,当然在运行时存在):
void empty(float *array, int l);
然后将代码放在一个单独的C文件中,您可以单独编译和链接。
答案 2 :(得分:1)
您在标题中将函数empty
定义为全局符号。这意味着它将是包含它的所有编译单元中的可见符号。有三种常见的解决方法:
使其成为静态函数
static void empty(...) {...}
将实现放入单独的编译单元
header.h
中的:
void empty(float *array, int l);
在empty.c
中实施
指示您的链接器忽略重复的符号。这与链接器不同,请参阅man ld
。
在OS X上:-m
标志。
在Linux上:-z muldefs