C语言中避免全局变量的一种方法



假设我有变量counter。如果我需要:

  • 从代码中的许多地方访问和修改变量
  • 确保以"正确"的方式修改变量,

这个解决方案是足够的,还是有更有效/更干净的方法?

int counter_access(int value) {
    static int counter = 0;
    if (value > 100) {
        printf("there is a bug in the code");
        return counter;
    }
    counter += value;
    return counter;
}

然后当我需要修改变量时:

counter_access(10); /* increase counter by 10 */
counter_access(-2); /* decrease counter by 2 */

当我需要访问变量:

if (counter_access(0) == 100) do_something();

这个解决方法在我看来相当笨拙。然而,我想不出很多好的方法来做到这一点。我可以使用全局变量(这会导致bug)。我可以将counter的地址传递给需要它的函数,但这并不能确保变量不会以不正确的方式被修改(在上面的例子中,如果counter增加了100以上,则存在错误)。

从本质上讲,使用函数访问变量的问题在于,没有一种令人满意的方法来告诉调用者该值是不正确的。

对于单线程程序来说,使用单个函数是一个很好的选择,您只需要以适当的方式设置。

可以使用一些"out of the range"的值来表示出错了。在您的情况下,计数器范围是0 ..100 .

你可以这样写:

#define COUNT_OVERFLOW            -1
#define COUNT_UNDERFLOW           -2
#define counter_get()    counter_add(0)
int counter_add(int incr) 
{ 
    static int counter = 0;
    int counter_temp;
    counter_temp = counter +incr;
    if (counter_temp < 0)    return COUNT_UNDERFLOW;
    if (counte_temp > 100)   return COUNT_OVERFLOW;
    counter = counter_temp;
    return counter;
}

现在,要检测错误,您可以检查返回值是否为<0:

cnt = counter_add(x);
if (cnt < 0) {
  fprintf(stderr,"There is a bug in the coden");
}
....
if (counter_get() == 100) {
  printf("DONE!n");
}

注意,即使出现错误,counter的值也会保留。此外,最好不要让像counter_access()这样的函数打印错误消息,最好检查返回值并让调用者打印它(如果有这种倾向)。

我添加了宏counter_get(),以避免让用户记住添加0有返回当前计数器值的副作用。

如前所述,在更复杂的情况下不应该使用静态变量(或等价的全局变量)。在这些情况下,正确的方法是为每个线程建立一个struct,并保留与该线程状态相关的变量。你必须传递一个指向该结构体的指针,并让counter_access()函数接受它作为参数。

仔细观察,您可以看到这里我们试图模仿封装数据和操作的面向对象方法。在本例中,我们(隐式地)实现了对象(计数器)的单个实例,该实例有两个方法:一个用于更改值,一个用于获取值。

相关内容

  • 没有找到相关文章

最新更新