Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 具有全局变量的头文件的相互包含_C_Global Variables_Header Files_Microcontroller - Fatal编程技术网

C 具有全局变量的头文件的相互包含

C 具有全局变量的头文件的相互包含,c,global-variables,header-files,microcontroller,C,Global Variables,Header Files,Microcontroller,我有一个没有运行任何操作系统的微控制器的C程序中的许多模块。每个模块都有自己的类型定义、枚举和数据结构定义来表示模块的状态,我认为在模块的相关头文件中定义它们会很好 然后,我在global_var.c中定义了一个全局变量来“记住”整个系统的当前状态。由于在全局变量的定义中引用了模块的数据结构,因此所有模块头都包含在全局变量h中 但是,这些模块还需要访问全局变量,因此它们还需要包含全局变量 如果我真的想保留全局变量,如何避免头文件的相互包含 非常感谢 全局变量h #ifndef GLOBAL_VA

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

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

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

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

非常感谢

全局变量h

#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;