我在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;
}
答案 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;
为每个模块执行此操作,并在任何位置包含标题。