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

时间:2018-07-12 22:52:18

标签: 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声明为静态,它们在程序中都不会只有一个副本。 / p>

4)我可以将上述.h文件包含在源文件中,即程序的不同模块中的.c文件(而不是其.h文件),并且如果代码编写为,它们将共享完全相同的var1和var2以上,对吗?

如您所见,当与多个文件共享变量时,我对.h中的extern与仅声明和定义.c文件中的变量之间的区别感到困惑。

谢谢。

2 个答案:

答案 0 :(得分:1)

1)是的,您可以隐藏var1var2,只需从头文件中删除extern声明并将源文件中的声明更改为static。这样可以防止链接程序将其定义公开给其他文件。

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;
}

答案 1 :(得分:-1)

尽管这不是标准的,但您可以使用#pragma once [1]作为替代方法包括防护措施。许多现代的编译器都支持它。

[1] https://en.wikipedia.org/wiki/Pragma_once