头文件与全局变量相互包含

时间:2013-08-30 14:06:26

标签: c global-variables header-files microcontroller

我在C程序中有许多模块,用于没有运行任何操作系统的微控制器。每个模块都有自己的类型定义,枚举和数据结构定义来表示模块的状态,我认为在模块的相关头文件中定义它们是很好的。

然后,我在global_var.c中定义了一个全局变量来“记住”整个系统的当前状态。由于模块的数据结构在全局变量的定义中被引用,因此所有模块头都包含在global_var.h中。

但是,这些模块还需要访问全局变量,因此它们也需要包含global_var.h。

如果我真的想保留全局变量,如何避免相互包含头文件?

非常感谢!

global_var.h

#ifndef GLOBAL_VAR_H
#define GLOBAL_VAR_H
#include "module.h"

typedef struct GLOBAL_STRUCTURE {
    module_structure m;        
} global_structure;
#endif

global_var.c

#include "global_var.h"
global_structure gs;

module.h中

#ifndef MODULE_H
#define MODULE_H
typedef struct MODULE_STRUCTURE {
    int a;
} module_structure;

void module_function(void);
#endif

的module.c

#include "global_var.h"
extern global_structure gs;

void module_function(void) {
    gs.m.a=0;
}

2 个答案:

答案 0 :(得分:0)

我认为C语言应该共享两次全局定义。但这取决于编译器(井链接器),你的工具链是否实际上做了我有一些做的和一些不。最安全的路径是只声明变量一次,并在其他地方显式声明它为extern。你会经常看到这样做:

COMMON.H

#ifundef HELLO
#define HELLO
#endif
HELLO unsigned int myglobx;

one.c

#include "common.h"

two.c

#include "common.h"

three.c

#define HELLO extern
#include "common.h"

答案 1 :(得分:0)

试试这个: 在Module.c中         #define XYZ

然后在Module.h

    #define MODULETYPE
    #ifdef XYZ
     MODULETYPE 

    #else
    MODULETYPE extern
   #endif
   MODULETYPE  int var1,var2;

为每个模块执行此操作,并在任何位置包含标题。