在 C 程序中,我希望所有文件共享特定变量。 Get 和 Set 方法将用于访问它们的数据。然而,它们的值永远不会被直接访问。我想我需要使用 extern 来做到这一点。下面的代码只是为了让大家理解这个概念。这是如何完成的:
头文件:
//shared.h
#ifndef SHARED_H_
#define SHARED_H_
extern int var1;
extern int var2;
void set_var1(int i);
int get_var1();
void set_var2(int i);
int get_var2();
#endif /*SHARED_H_*/
源文件:
//shared.c
#include shared.h
int var1=0;
int var2=0;
void set_var1(int i)
{
var1 = i;
}
int get_var1()
{
return var1;
}
void set_var2(int i)
{
var2 = i;
}
void get_var2()
{
return var2;
}
我现在对此有以下问题:
1) C 语言中没有办法隐藏 var1 和 var2 吗?
2) 我认为它们必须声明为 extern,以便无论 .h 文件共享多少次,整个程序中都只存在一个副本。我的理解正确吗?
3) 如果我不在 .h 文件中使用 extern,那么在 .c 文件中,无论我是否将 var1 和 var2 声明为静态,它们都不会在程序中拥有单个副本。
4)我可以将上述 .h 文件包含在源文件中,即程序的不同模块中的 .c 文件(不是它们的 .h 文件),如果代码编写为,它们将共享完全相同的 var1 和 var2上面,正确吗?
如您所见,当与多个文件共享变量时,我对 .h 中的 extern 和仅在 .c 文件中声明和定义变量之间的区别感到困惑。
谢谢。
最佳答案
1) 是的,您可以隐藏 var1
和 var2
,只需从头文件中删除 extern
声明并更改源文件静态化。这将防止链接器将其定义暴露给其他文件。
2, 3 ,4) extern
并不能确保“程序中存在单个副本”,但这才是头文件中保护宏的要点。
//shared.h
#ifndef SHARED_H_
#define SHARED_H_
/* uncomment these for public variables */
// extern int var1;
// extern int var2;
void set_var1(int i);
int get_var1();
void set_var2(int i);
int get_var2();
#endif /* SHARED_H_ */
//shared.c
#include "shared.h"
/* also delete the `static` qualifier for public variables */
static int var1 = 0;
static int var2 = 0;
void set_var1(int i)
{
var1 = i;
}
int get_var1()
{
return var1;
}
void set_var2(int i)
{
var2 = i;
}
void get_var2()
{
return var2;
}
关于c - 包含头文件时如何确保在整个程序中仅创建变量的单个副本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51315493/