在C中使用静态变量的最佳实践

时间:2011-11-11 14:50:30

标签: c variables static

全局变量通常被认为是一种糟糕的编程习惯

在C中,静态变量(即模块(文件)范围)是否正常?

我的想法是,面向对象语言中的成员变量不会比C中的静态变量危险得多,成员变量似乎被认为是一件好事。

我厌倦了通过多个函数传递参数,并且可以看到静态变量的吸引力,特别是如果它们是const

但我很想知道这是否令人不悦 - 以及在一个大对象与其几个方法中使用的成员变量和一个包含少量几个的C文件之间的编程顽皮程度是否真的有任何差别利用静态变量的函数?

6 个答案:

答案 0 :(得分:5)

C中的静态(文件范围)变量类似于C ++中的静态成员变量。

使用非常量静态变量进行函数之间的通信会使这些函数变得不可靠并且线程不安全。因此,通常最好通过参数传递信息。

非静态成员变量的更好模拟是结构成员。只需在结构中收集“成员变量”,并将该结构作为“this”参数传递。

答案 1 :(得分:2)

最大的区别是:使用成员变量,您可以拥有多个对象,每个对象都有自己的成员变量。对于模块范围静态变量,您只有一个变量实例。

如果要比较模块级静态变量和静态类成员变量,那么没有真正的重大区别。两者都只实例化一次,只有范围和访问规则不同。

答案 2 :(得分:2)

静态变量的一个主要缺点是“副作用”,即当函数的结果不仅取决于输入参数,这使得测试和调试更加困难。 没有副作用的函数更容易测试,因为您可以假设每次使用相同的参数集调用函数时,您都可以获得相同的结果。

如果您有错误,可以检查结果是否与输入参数相符。如果那时你意识到输入参数是错误的,那么你可以在你的代码中错误地跟踪/ who作为参数。如果您的函数依赖于静态变量并且静态变量没有预期值,那么如何跟踪/查找原因和方式如何变化?

因此,如果要使用常量,则使用适当的常量(#DEFINE)或将参数分组到结构中并尝试尽可能避免使用静态变量。 (至少#DEFINE值不会在内存中被破坏)

答案 3 :(得分:1)

静态变量可能略微优于全局变量,但并不多。然而,不像全局变量那样邪恶并不是一个值得赞扬的地方!

如果您有多个线程或可重入函数,那么它们就不够了。使用它们作为参数传递机制会导致代码难以阅读和维护。静态变量有用,但我从不使用它们进行参数传递。在某些情况下,可以更好地将参数收集到要传递的结构中。

答案 4 :(得分:1)

您可以使用全局或静态变量,但要小心使用它们。我不确定模块范围的静态变量是否比全局变量好得多。

特别是,即使是一个大型节目,也有十几个全局变量可能很差(但是会发生这种情况)。

您可能更愿意将静态或全局数据分组为较大的struct - s。

答案 5 :(得分:1)

在您尝试使用它们的上下文中,模块变量可能是一个坏主意。通过参数传递所有内容的好处是,很难与方法调用失去同步。每个方法都做了一些事情并将其中的一些组件传递给另一个方法,因此它很容易跟踪 - 变量只在方法调用期间生效。如果变量存在于其他地方,那么调试就会变得更加困难 - 比如使用过时的变量就变得不可能了。

静态变量通常用作标志 - 一个常见的是一个布尔值,你设置为以微妙的方式改变整个模块的模式(准内置的是DEBUG)。