我定义了一个特殊文件:config.h
我的项目也有文件:
t.c, t.h
pp.c, pp.h
b.c b.h
l.cpp
和#includes:
在t.c:
#include "t.h"
#include "b.h"
#include "pp.h"
#include "config.h"
b.c中的:
#include "b.h"
#include "pp.h"
在pp.c:
#include "pp.h"
#include "config.h"
l.cpp中的:
#include "pp.h"
#include "t.h"
#include "config.h"
我的*.h
文件中没有包含指令,仅在*.c
个文件中。我在config.h中定义了这个:
const char *names[i] =
{
"brian", "stefan", "steve"
};
并且在l.cpp,t.c,pp.c中需要该数组但是我收到此错误:
pp.o:(.data+0x0): multiple definition of `names'
l.o:(.data+0x0): first defined here
t.o:(.data+0x0): multiple definition of `names'
l.o:(.data+0x0): first defined here
collect2: ld returned 1 exit status
make: *** [link] Error 1
我在项目中使用的每个*.h
文件中都包含了警卫。有任何帮助解决这个问题吗?
答案 0 :(得分:89)
不要在标头中定义变量。将声明放在其中一个.c文件的头文件和定义中。
在config.h中
extern const char *names[];
在某些.c文件中:
const char *names[] =
{
"brian", "stefan", "steve"
};
如果在头文件中放置全局变量的定义,那么此定义将转到包含此标头的每个.c文件,并且您将获得多个定义错误,因为可以多次声明varible但是可以只定义一次。
答案 1 :(得分:23)
公共函数的声明在头文件中,是的,但定义在标题中也绝对有效!如果要在实用程序函数的标题中定义事物,而不想在每个c文件中再次定义,则可以将定义声明为静态(整个程序只允许1个副本)。 I.E.定义枚举和静态函数以将枚举转换为字符串。然后,您不必为包含标头的每个.c文件重写enum到字符串转换器。 :)