c - 理论 : getter/setter function or global variable? C

标签 c global

我目前正在写一个 C 图书馆我需要使用静态 void* 的地方。

在我的第一个版本中,我将所有需要访问 void* 的函数放在声明它的同一个 C 文件中,如下所示:

主文件

int main()
{
  function_using_list();
}

foo.c:
void *list=NULL;

void *function_using_list()
{
  //stuff with list
}

在我的第二个版本中,我做了一个 get/set 函数,这样我就可以从代码中的任何地方通过它访问我的列表:

foo.c
void   *getset_list(void nlist, int action)
{
   static void  *list = NULL;

   if (action == 1)
     return (list)
   else
     list = nlist;
}

这两种不同设计的优缺点是什么?第二个是线程安全的吗?

PS:我刚刚意识到我在问题中忘记了一些内容:此代码旨在用作库。

最佳答案

第一种方法比第二种方法提供的控制更少,因为任何人都可以随时读取或更改全局变量 - 包括初始化之前的时间。

另一方面,第二种方法让您决定在变量尚未初始化时要做什么,因此如果您需要使用全局状态,则首选第二种方法。

还有第三种方法——在翻译单元级别创建一个静态变量,并添加两个单独的函数——一个用于 getter,一个用于 setter。这将使您不必通过 action=1action=0 :

static void *list = NULL;
void* get_list() {
    return list;
}
void set_list(void* newList) {
    list = newList;
}

这两种方法都“免费”为您提供线程安全。然而,方法在哪里static在函数内部为您提供了一种实现线程安全的简单方法,而第一个方法则将其留给调用者来处理对全局的同步访问。

关于c - 理论 : getter/setter function or global variable? C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21653795/

相关文章:

javascript - 函数中声明的全局对象不能被其他函数访问

angular - Angular 编译器要求 TypeScript >=2.7.2 和 <2.8.0,但找到了 2.8.3

c - 访问结构体数组中的字符指针

c - 用 C 构建凯撒密码解码器

c - C中的多线程

python - 为什么函数内的这个 DataFrame 修改会改变全局外部函数?

list - 如何在prolog中创建全局变量

C 传递给要处理的数组的参数

C使用sha2哈希函数

c# - 全局类中静态构造函数和定义静态实例的区别