在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文件中的变量之间的区别感到困惑。
谢谢。
答案 0 :(得分:1)
1)是的,您可以隐藏var1
和var2
,只需从头文件中删除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]作为替代方法包括防护措施。许多现代的编译器都支持它。