gpt4 book ai didi

c - C中避免全局变量的一种方法

转载 作者:行者123 更新时间:2023-12-01 23:41:01 25 4
gpt4 key购买 nike

假设我有变量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();

这个解决方案对我来说似乎有点笨拙。但是,我想不出很多好的方法来做到这一点。我可以使用全局变量(这会导致错误)。我可以将 counter 的地址传递给需要它的函数,但这并不能确保变量没有以不正确的方式被修改(在上面的示例中,如果 counter 递增超过100,有错误)。

本质上,使用函数访问变量的问题是没有令人满意的方式告诉调用者该值不正确。

最佳答案

对于这样的事情使用单个函数对于单线程程序来说是一个不错的选择,您只需要以正确的方式进行设置即可。

要发出出错的信号,您可以使用一些“超出范围”的值。在您的情况下,计数器范围是 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 code\n");
}
....
if (counter_get() == 100) {
printf("DONE!\n");
}

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

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

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

仔细观察,你会发现这里我们试图模仿面向对象的方法来封装数据和操作。在这种情况下,我们(隐式地)实现了一个对象(计数器)的单个实例,该实例具有两种方法:一种用于更改值,一种用于获取值。

关于c - C中避免全局变量的一种方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40055564/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com