静态变量vs单身人士的结构

时间:2017-12-01 18:08:40

标签: c struct static

从软件设计的角度来看,我应该何时更喜欢(文件范围)静态变量而不是结构来实现我只需要单个实例的模块,或者更喜欢静态变量的结构? / 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不知道单身人士,我只是说我只是实例化模块一次),而有些则不是。我个人更喜欢带有静态变量的版本,因为它更少打字,看起来整体更干净。但我犹豫是否重写相应的模块,因为它将结束统一的风格。一个版本比另一个版本有任何客观优势吗?

还有第二个问题密切相关。在那些单例模块中,可以在运行时决定单个模块的不同实现。如果我在所有实现中都有文件范围静态变量,那么所有实例都会被分配,甚至只使用单个实现的那些。

1 个答案:

答案 0 :(得分:0)

所示的两个版本在所需方面不具有可比性,因为它们在ab的定义位置以及可见性和可访问性方面存在很大差异:在module_a.c中,ab是从main.c定义,初始化和不可访问的,而在module_b.c中,结构成员ab被分配并在main.c中初始化,并作为参数传递给函数module_b_add()

要显示可比较的版本,我们必须将module_a.c更改为

int module_a_add(int a, int b)
{
    return a + b;
}

({ab作为参数传递给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中一样)。