全局变量通常被认为是一种不良的编程实践。
在C语言中,具有模块(文件)作用域的静态变量是否被认为是可以接受的?
我的想法是,在面向对象的语言中,成员变量可能比C语言中的静态变量更加安全,而且成员变量似乎被认为是一件好事。
我厌倦了通过多个函数传递参数,并且可以看到使用静态变量的吸引力,特别是如果它们是const
。
但我很想知道这是否被视为不良实践,以及一个具有成员变量并在其多个方法中使用的大型对象与包含几个使用静态变量的函数的C文件之间是否真的存在编程错误的级别差异?
全局变量通常被认为是一种不良的编程实践。
在C语言中,具有模块(文件)作用域的静态变量是否被认为是可以接受的?
我的想法是,在面向对象的语言中,成员变量可能比C语言中的静态变量更加安全,而且成员变量似乎被认为是一件好事。
我厌倦了通过多个函数传递参数,并且可以看到使用静态变量的吸引力,特别是如果它们是const
。
但我很想知道这是否被视为不良实践,以及一个具有成员变量并在其多个方法中使用的大型对象与包含几个使用静态变量的函数的C文件之间是否真的存在编程错误的级别差异?
C语言中的静态(文件作用域)变量类似于C ++中的静态成员变量。
任何使用非const静态变量进行函数间通信都会使那些函数不可重入和线程不安全。因此,通常最好通过参数传递信息。
非静态成员变量的更好类比是结构体成员。只需在结构体中收集您的“成员变量”,并将该结构体作为“this”参数传递即可。
区别在于:使用成员变量时,您可以拥有多个对象,每个对象都有自己的成员变量。使用模块范围的静态变量,则只有一个实例。
如果要比较模块级静态变量和静态类成员变量,则没有真正的大区别。两者都只实例化一次,只是作用域和访问规则不同。
静态变量可能比全局变量稍微好一些,但并不多。然而,不像全局变量那样邪恶并不能算是什么值得称赞的事情!
当你有多个线程或可重入函数时,它们就不够用了。更重要的是,将它们用作参数传递机制会导致代码非常难以阅读和维护。静态变量有其用途,但我永远不会将它们用于参数传递。在某些情况下,将参数收集到结构体中以便传递可能更好。
你可以使用全局或静态变量,但要小心使用。我不确定模块范围的静态变量是否比全局变量好多少。
特别是,在即使是大型程序中拥有超过十几个全局变量可能会被认为是不好的品味(但这种情况确实存在)。
而且,你可能更喜欢将静态或全局数据分组在较大的struct
中。