从软件设计的角度来看,我应该何时更喜欢(文件范围)静态变量而不是结构来实现我只需要单个实例的模块,或者更喜欢静态变量的结构? / p>
一个小例子来说明(为了简单起见没有标题):
module_a.c
static int a = 1;
static int b = 2;
int module_a_add(void)
{
return a + b;
}
module_b.c
struct s_module_b {
int a;
int b;
};
int module_b_add(struct s_module_b *obj)
{
return obj->a + obj->b;
}
的main.c
int main(int argc, char **argv)
{
int res;
//v1
res = module_a_add();
//v2
struct s_module_b mod = {1,2};
res = module_b_add(&mod);
return 0;
}
更进一步,让我们看一个更大的项目:我有一些使用静态变量实现的实用程序模块。但是,执行不同计算阶段的更多中心模块都使用结构体来实现。从这些模块中,有些是单身人士(我知道C不知道单身人士,我只是说我只是实例化模块一次),而有些则不是。我个人更喜欢带有静态变量的版本,因为它更少打字,看起来整体更干净。但我犹豫是否重写相应的模块,因为它将结束统一的风格。一个版本比另一个版本有任何客观优势吗?
还有第二个问题密切相关。在那些单例模块中,可以在运行时决定单个模块的不同实现。如果我在所有实现中都有文件范围静态变量,那么所有实例都会被分配,甚至只使用单个实现的那些。
答案 0 :(得分:0)
所示的两个版本在所需方面不具有可比性,因为它们在a
和b
的定义位置以及可见性和可访问性方面存在很大差异:在module_a.c
中,a
和b
是从main.c
定义,初始化和不可访问的,而在module_b.c
中,结构成员a
和b
被分配并在main.c
中初始化,并作为参数传递给函数module_b_add()
。
要显示可比较的版本,我们必须将module_a.c
更改为
int module_a_add(int a, int b)
{
return a + b;
}
({a
和b
作为参数传递给v2
),或module_b.c
传递给
static struct s_module_b {
int a;
int b;
} obj = {1, 2};
int module_b_add(void)
{
return obj.a + obj.b;
}
(从main.c
无法访问,就像v1
中一样)。