【发布时间】:2013-08-23 18:07:37
【问题描述】:
我在一个项目 (Visual Studio) 中有 3 个 *.c 文件(file1.c、file2.c 和 file3.c)和 1 个 *.h 文件(file3.h)。
/*******************************
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"。
我确实检查了预处理器的输出,所有 *.c 文件中都包含了 gintVariable,即使我已经包含了包含保护。
我做错了什么?
【问题讨论】:
-
你的错误是假设包含保护防止多个定义。出于好奇,是什么让您产生了这个想法?
-
@LuchianGrigore:如果不包含,包含守卫将仅包含标题。我说的对吗?
-
同一个翻译单元,是的。但是您正在编译多个文件,对吗?
-
@OnlyQuestions Include guards 在一个 .cpp 文件中工作。 它们防止在一个文件中包含多个标头,但在不同文件中不包含相同标头。
-
@Angew:哦,我现在明白了。谢谢。出于好奇,我想生成一个场景,其中单个文件发生多次包含。能给我举个例子吗?
标签: c global-variables include-guards