我正在开发一个嵌入式 c 项目,并且遇到全局变量重新定义的问题。
我已将函数声明和定义分成几个 .h 和 .c 文件。其中许多函数需要访问全局变量,这些变量在 global_vars.h 中定义。因此,在头文件的开头,#ifndef、#define 部分中,“global_vars.h”。如果我不这样做,正如您可能想象的那样,我会收到一堆未定义的变量错误。
但是,即使 global_vars.h 具有 #ifndef _GLOBAL_VARS_H_ #define... #endif,我也会收到所有全局变量的重新定义错误。我的猜测是,当链接器尝试链接各个目标文件时,它会看到由于所有“blah_blah.h”文件中的#include“global_vars.h”而导致的重新定义。不过,据我了解,#ifndef... 可以解决这个问题。
有什么我忽略的吗?
提前致谢
链接器永远不会在 global_vars.h 文件中看到任何内容,除非——坏消息! -- 一些全局变量实际上是defined在该文件中。 global_vars.h 应该只包含声明对于这些全局变量,从来没有(好吧,几乎从来没有)它们的定义。
在 global_vars.h 中,您应该有如下声明:
extern int some_global;
您不可以:
int some_global;
如果您在 global_vars.h 中有定义,那么,是的,它们将在链接时被多重定义,因为 #includes global_vars.h 的每个 .c 文件都将拥有每个已定义变量的自己的定义。
的所有定义extern
全局变量必须位于some.c 文件,当然。通常哪个 .c 文件并不重要。通常,所有全局变量定义都位于名为(惊讶!)global_vars.c 的文件中。
因此,请确保 global_vars.h 中没有任何全局变量定义,这样您就会处于良好状态。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)