对于不运行任何操作系统的微控制器,我在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
模块.c
#include "global_var.h"
extern global_structure gs;
void module_function(void) {
gs.m.a=0;
}
我认为C语言应该共享两次定义的全局。但这取决于编译器(好的链接器),你的工具链是否真的做到了,我有一些做到了,有些没有。最安全的方法是只声明一次变量,其他任何地方都显式声明为extern。你会经常看到这样做:
common.h
#ifundef HELLO
#define HELLO
#endif
HELLO unsigned int myglobx;
一个.c
#include "common.h"
2.c
#include "common.h"
3.c
#define HELLO extern
#include "common.h"
试试这个:在模块.c中#定义XYZ
然后在模块.h 中
#define MODULETYPE
#ifdef XYZ
MODULETYPE
#else
MODULETYPE extern
#endif
MODULETYPE int var1,var2;
对每个模块都这样做,并在任何您想要的地方包含您的头。