听起来您已经在标头中定义了一个变量,然后将其包含在两个不同的源文件中。
首先,您必须了解声明某事物(声明它存在于某处)和定义它(实际上是创建它)之间的区别。假设您有以下文件:
header.h:
void printIt(void); // a declaration.
int xyzzy; // a definition.
main.c:
#include "header.h"
int main (void) {
xyzzy = 42;
printIt();
return 0;
}
other.c:
#include <stdio.h>
#include "header.h"
void printIt (void) { // a definition.
printf ("%d\n", xyzzy);
}
当您编译 C 程序时,每个生成的目标文件都会调用一个变量,xyzzy
因为您通过包含头文件有效地在两者中定义了它。这意味着当链接器尝试组合这两个对象时,会遇到多个定义的问题。
解决办法是在头文件中声明东西,在C文件中定义,比如:
header.h:
void printIt(void); // a declaration.
extern int xyzzy; // a declaration.
main.c:
#include "header.h"
int xyzzy; // a definition.
int main (void) {
xyzzy = 42;
printIt();
return 0;
}
other.c:
#include <stdio.h>
#include "header.h"
void printIt (void) { // a definition.
printf ("%d\n", xyzzy);
}
这样,other.c
知道xyzzy
存在,但只main.c
创造它。