项目中有3个*.c
个文件(file1.c
,file2.c
和file3.c
)和1个*.h
文件(file3.h
)( Visual Studio)。
/*******************************
file3.h
********************************/
#ifndef FILE3_H
#define FILE3_H
int gintVariable = 400;
#endif
/*******************************
file1.c
********************************/
#include "file3.h"
#include <stdio.h>
#include <conio.h>
int modifyGlobalVariable(void);
void printGlobalVariable(void);
int main(void)
{
modifyGlobalVariable();
printGlobalVariable();
printf("Global variable: %d\n", gintVariable++);
getch();
return 0;
}
/*******************************
file2.c
********************************/
#include "file3.h"
int modifyGlobalVariable(void)
{
return gintVariable++;
}
/*******************************
file3.c
********************************/
#include "file3.h"
#include <stdio.h>
void printGlobalVariable(void)
{
printf("Global: %d\n", gintVariable++);
}
当我在VS中构建解决方案时,它会给出错误"_gintVariable already defined in file1.obj"
。
我确实检查了预处理器输出,gintVariable包含在所有* .c文件中,即使我已经包含了包含警戒。
我在做什么错误?
答案 0 :(得分:8)
在头文件中声明全局变量时,应使用“extern
”。
在*.c
文件的任何一个中定义它。
这应该可以解决问题。
有关头文件的更多信息,请阅读 How do I use extern to share variables between source files?
答案 1 :(得分:4)
包含警卫可以防止在单个翻译单元中多次包含(或者更准确地说,多次编译.h文件内容)。
对这个问题有用:
/* glob.h */
#ifndef H_GLOB
#define H_GLOB
struct s { int i; };
#endif
/* f.h */
#ifndef H_F
#define H_F
#include "glob.h"
struct s f(void);
#endif
/* g.h */
#ifndef H_G
#define H_G
#include "glob.h"
struct s g(void);
#endif
/* c.c */
#include "f.h" /* includes "glob.h" */
#include "g.h" /* includes "glob.h" */
void c(void) {
struct s s1 = f();
struct s s2 = g();
}
夹杂物就像钻石一样:
glob.h / \ f.h g.h \ / c.c