c-Include Guard仍在插入全局变量



我在一个项目(Visual Studio)中有3个*.c文件(file1.cfile2.cfile3.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: %dn", 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: %dn", gintVariable++);
}

当我在VS中构建解决方案时,它给出的错误为"_gintVariable already defined in file1.obj"

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

我犯了什么错误?

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

有关头文件的详细信息,请阅读如何使用extern在源文件之间共享变量?

包含保护可以防止在单个翻译单元中多次包含(或者更准确地说,是对.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

相关内容

  • 没有找到相关文章

最新更新