C 具有全局变量的头文件的相互包含
我有一个没有运行任何操作系统的微控制器的C程序中的许多模块。每个模块都有自己的类型定义、枚举和数据结构定义来表示模块的状态,我认为在模块的相关头文件中定义它们会很好 然后,我在global_var.c中定义了一个全局变量来“记住”整个系统的当前状态。由于在全局变量的定义中引用了模块的数据结构,因此所有模块头都包含在全局变量h中 但是,这些模块还需要访问全局变量,因此它们还需要包含全局变量 如果我真的想保留全局变量,如何避免头文件的相互包含 非常感谢 全局变量hC 具有全局变量的头文件的相互包含,c,global-variables,header-files,microcontroller,C,Global Variables,Header Files,Microcontroller,我有一个没有运行任何操作系统的微控制器的C程序中的许多模块。每个模块都有自己的类型定义、枚举和数据结构定义来表示模块的状态,我认为在模块的相关头文件中定义它们会很好 然后,我在global_var.c中定义了一个全局变量来“记住”整个系统的当前状态。由于在全局变量的定义中引用了模块的数据结构,因此所有模块头都包含在全局变量h中 但是,这些模块还需要访问全局变量,因此它们还需要包含全局变量 如果我真的想保留全局变量,如何避免头文件的相互包含 非常感谢 全局变量h #ifndef GLOBAL_VA
#ifndef GLOBAL_VAR_H
#define GLOBAL_VAR_H
#include "module.h"
typedef struct GLOBAL_STRUCTURE {
module_structure m;
} global_structure;
#endif
全局变量c
#include "global_var.h"
global_structure gs;
模块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语言应该共享一个定义为两次的全局变量。但这取决于编译器(well linker),你的工具链是否真的做到了这一点,我有一些做到,一些没有做到。最安全的方法是只声明变量一次,在其他地方显式声明它为extern。您经常会看到这样做: 普通的
#ifundef HELLO
#define HELLO
#endif
HELLO unsigned int myglobx;
一、c
二、c
三、c
#define HELLO extern
#include "common.h"
试试这个:
在模块c中
#定义XYZ
然后在模块h中
#define MODULETYPE
#ifdef XYZ
MODULETYPE
#else
MODULETYPE extern
#endif
MODULETYPE int var1,var2;
对每个模块执行此操作,并在任何需要的地方包含标题。您显示的源代码应该编译。请告诉我们实际失败的是什么代码>应该进入
global\u var.h
。没有相互包含,因为module.h
不包含global\u var.h
。包含在.c
-文件中没有问题。
#define HELLO extern
#include "common.h"
#define MODULETYPE
#ifdef XYZ
MODULETYPE
#else
MODULETYPE extern
#endif
MODULETYPE int var1,var2;