3

我正在开发一个嵌入式 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... 会处理这个问题。

有什么我忽略的吗?

提前致谢

4

3 回答 3

8

链接器永远不会在 global_vars.h 文件中看到任何内容,除非——坏消息!-- 一些全局变量实际上是在该文件中定义的。global_vars.h 应该只包含这些全局变量的声明,从不(嗯,几乎从不)它们的定义。

在 global_vars.h 中,您应该有如下声明:

extern int some_global;

您不得拥有:

int some_global;

如果您在 global_vars.h 中有定义,那么,是的,它们将在链接时被多次定义,因为 #includes global_vars.h 的每个 .c 文件都将对每个定义的变量都有自己的定义。

当然,所有全局变量的定义都extern必须在某个.c 文件中。通常哪个 .c 文件并不重要。通常所有的全局变量定义都在一个名为(惊喜!)global_vars.c 的文件中。

因此,请确保 global_vars.h 中没有任何全局变量定义,您将处于良好状态。

于 2011-06-16T21:39:41.400 回答
2

在 H 文件中定义全局变量不是一个好主意。如果您在 C 或 C++ 文件中执行此操作,并且在其他模块中包含和 H 文件,并且这些全局变量作为外部变量,则效果会更好。像这样>>>

我的模块 c 文件

unsigned short int AGLOBAL = 10; // definer and initializer

void MyFunc(void)
{
  AGLOBAL+=1; // no need to include anything here cause is defined above
  // more .....

}

我的 H 文件 globals.h

// this is to include only once
#ifndef MYH
#define MYH
extern unsigned short int AGLOBAL; // no value in here!

#endif

其他模块c文件

#include globals.h

char SomeOtherFunc(void)
{
  AGLOBAL+=10; // ok cause its defined by globals.h
  // do more....
}
于 2011-06-28T20:11:28.567 回答
1
于 2015-08-10T12:14:34.623 回答