我定义了一个特殊的文件: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"
在公元前:
#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
文件中没有include 指令,只有在*.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
文件中都包含了守卫。有帮助解决这个问题吗?
最佳答案
不要在标题中定义变量。将声明放在 header 中,将定义放在其中一个 .c 文件中。
在config.h中
extern const char *names[];
在一些 .c 文件中:
const char *names[] = {
"brian", "stefan", "steve" };
如果你把一个全局变量的定义放在一个头文件中,那么这个定义将转到每个包含这个头文件的.c文件,你会得到多重定义错误,因为一个变量可能被声明多次但可以只定义一次。
此外,如果您必须在头文件中定义变量,您还可以做一件事,您可以使用 static
关键字。
static const char *names[] = {
"brian", "stefan", "steve" };
这样变量 names
将在整个程序中只定义一次,并且可以多次访问。
关于c - 多重定义 ... 链接器错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17764661/