说我有4个文件。
file1.h
file1.c
file2.h
file2.c
在file1.h
我有一个变量:
static short mode=0;
file1.c
中的:
#include "file1.h"
...............
if ( mode ==0)
do stuff
else {
do something else
}
我遇到的问题是我只能更改mode
file2.c
值
在file2.h中我包含file1.h,在源文件2中,我将值更改为1
,但这对file1.c
答案 0 :(得分:3)
当你写一行像
static short mode=0;
<。>在.h文件中.h文件包含在多个.c文件中,您可以有效地创建多个short mode
变量,每个.c文件中最多包含一个.h文件。
如果您想拥有一个变量,请将其设为extern
,请确保仅在一个.c文件中定义它。
在file1.h中:
// Just the declaration in the .h file.
extern short mode;
在file1.c中:
// The definition in only one .c file.
short mode = 0;
答案 1 :(得分:2)
将变量声明为static
的重点是减小其范围并使其无法访问其他文件。这称为私有封装,是良好的编程习惯。
私有封装的反义词称为意大利面条编码,您可以使用extern
关键字将变量声明为全局变量。这是非常糟糕的编程习惯(除非在某些情况下变量被声明为const,这不是这里的情况)。
在任何情况下,您都不应该尝试基于私有封装将优质代码重写为基于意大利面条的错误代码。
此外,你永远不应该在头文件中定义变量,因为这从来没有任何意义。头文件只是对接口的描述,它在相应的c文件中实现,它不应该实现任何东西(即使C允许一个人做各种愚蠢和疯狂的事情)。
你应该做的是:
file1.h
short get_mode (void);
void set_mode (short m);
file1.c中
#include "file1.h"
static short mode = 0;
short get_mode (void)
{
return mode;
}
void set_mode (short m)
{
mode = m;
}
some_other_file.c
#include "file1.h"
short mode = get_mode();
do_stuff_with(mode);
这就是你如何正确设计节目的时期。无论使用哪种编程语言。不要听任何推荐extern
或其他此类废话的人!
答案 2 :(得分:1)
如果您在.h文件中定义静态并且在.h
文件中包含.c
文件,则基本上在每个.c文件中定义静态变量,它们都是不同的对象。
你必须做
extern short mode;
在某个.h
文件中,并将此.h
包含在您需要的.c
个文件中。
在某个.h
文件中声明变量后,您需要在某处定义它...我的意思是在某个.c
文件中。
short mode;
答案 3 :(得分:0)
将变量声明移至file1.c
并删除static
:
short mode=0;
将extern
定义添加到file1.h
:
extern short mode;
答案 4 :(得分:-1)
这是此上下文中static
的语义:它在每个源文件中创建一个单独的变量。
对于跨越多个源文件的公共变量,您需要在每个源文件中使用extern
声明(通常通过标头 - 和一个定义)源文件。
总的来说,我可以推荐C FAQ(http://c-faq.com/)。有一个关于声明和定义的部分,http://c-faq.com/decl/decldef.html。