C 包括仍然插入全局变量的Guard

C 包括仍然插入全局变量的Guard,c,global-variables,include-guards,C,Global Variables,Include Guards,我在一个项目(Visual Studio)中有3个*.c文件(file1.c、file2.c和file3.c)和1个*.h文件(file3.h) /******************************* 文件3.c ********************************/ #包括“file3.h” #包括 void printGlobalVariable(void) { printf(“全局:%d\n”,gintVariable++); } 当我在VS中构建解决方案时,它

我在一个项目(Visual Studio)中有3个
*.c
文件(
file1.c
file2.c
file3.c
)和1个
*.h
文件(
file3.h



/*******************************
文件3.c
********************************/
#包括“file3.h”
#包括
void printGlobalVariable(void)
{
printf(“全局:%d\n”,gintVariable++);
}
当我在VS中构建解决方案时,它给出的错误是
“\u gintVariable已经在file1.obj中定义”

我确实检查了预处理器输出,gintVariable包含在所有*.c文件中,尽管我已经包含了guards


我犯了什么错误?

在头文件中声明全局变量时,应该使用“
extern
”。 在
*.c
文件中的任意一个中定义它。 这应该可以解决这个问题

有关头文件的详细信息,请阅读

包含保护可防止在单个翻译单元中多次包含(或者更准确地说,多次编译.h文件内容)

这有助于解决此问题:

/*glob.h*/
#ifndef H_GLOB
#定义H_GLOB
结构s{int i;};
#恩迪夫



包裹体就像钻石:

glob.h / \ f.h g.h \ / c.c 全球h / \ f、 h.g.h \ / c、 c
您的错误是假设包含了针对多个定义的保护。出于好奇,你是怎么想到这个的?@LuchianGrigore:include-guards只会在不包括标题的情况下包含标题。我说的对吗?对于同一个翻译单位,是的。但是你编译了不止一个文件,对吗?@只有一个问题包括一个.cpp文件中的警卫工作。它们可以防止在一个文件中多次包含一个头,但不能在不同的文件中包含相同的头。@Angew:噢,我现在明白了。谢谢出于好奇,我想生成一个场景,在这个场景中,单个文件会发生多个包含。你能给我举个例子吗?
/*******************************
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++);
}
/* 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