C 在h文件中声明的全局变量及其访问权限

C 在h文件中声明的全局变量及其访问权限,c,header,extern,globals,C,Header,Extern,Globals,只是一个简单的理解问题: 变量extern int x_glob在头glob.h中声明 因此,在每个包含在glob.h中使用此变量声明的函数的c文件中,我必须像这样重新定义它: extern void func_1( void ) { int x_glob; glob_x++; return(); } 对吗 如果我在glob.h中的x_glob声明中省略了外部词,我就不需要定义了 为什么不把extern字留在头文件中呢 也许这个问题听起来很蠢——我的目标是在这个问题上建立一个更好

只是一个简单的理解问题:

变量
extern int x_glob
在头
glob.h
中声明

因此,在每个包含在
glob.h
中使用此变量声明的函数的c文件中,我必须像这样重新定义它:

extern void func_1( void )
{
  int x_glob;

  glob_x++;
  return();
}
对吗

如果我在
glob.h
中的
x_glob
声明中省略了外部词,我就不需要定义了

为什么不把
extern
字留在头文件中呢

也许这个问题听起来很蠢——我的目标是在这个问题上建立一个更好的结构
随着项目的发展,我的程序也在不断增加。

不,这是错误的。使用函数中的
int x_glob
可以声明一个本地自动变量。这将覆盖任何全局变量

但在一个.c文件中,您必须声明全局变量:

// main.c

int x_glob;
这将创建一个现在可由所有模块使用的变量。变量的
extern
版本仅在编译其他模块时告知编译器,在某个地方存在该变量,并且在将模块链接到可执行文件时会找到该变量

就个人而言,我更喜欢以下设置:

// glob.h
#ifndef EXTERN
#define EXTERN extern
#endif
EXTERN int x_glob;

// module.c
#include "glob.h"

// main.c
#define EXTERN
#include "glob.h"

在所有模块中,
x\u glob
将被称为
extern
,而在主要模块中,它将不是extern,因此将声明全局变量的存储。

“至少”->“准确”。否则,链接会因多个定义而失败。谢谢你,我的朋友-树太多了,无法看到forest@Dagute,然后单击左侧的按钮接受我的答案。很高兴能帮上忙。@paul-哪个按钮-对不起,我是新来的这个论坛现在在左边有一个上下按钮,上面写着“3”。点击“3”接受答案。这是您指出答案已解决或帮助您解决问题的方式。如果您想在代码中更好地结构化,请首先尽可能避免全局性。