c - 包含头文件时如何确保在整个程序中仅创建变量的单个副本

标签 c encapsulation

在 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) 是的,您可以隐藏 var1var2,只需从头文件中删除 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/

相关文章:

c - C缓冲区溢出的解释

c - 读取所有后续字符并转换为 int

c - 在GTK3中,如何让DrawingArea响应键盘事件?

java - 如何避免Java中脆弱的基类

构造函数中的 Java 可重写调用

c++ - C++嵌套类是正确的封装方法吗?

c++ - 可以在命名空间中包含变量吗?

将增量为 25 的 'for' 循环从 C 转换为 MATLAB

c - 在应该释放其内存后访问可变长度数组

c# - 如何让类更具可测性?