【问题标题】:Theory: getter/setter function or global variable? C理论:getter/setter 函数还是全局变量? C
【发布时间】:2014-02-09 16:12:25
【问题描述】:

我目前正在编写一个 C LIBRABY,我需要在其中使用静态 void*。

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

main.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:我刚刚意识到我在我的问题中忘记了一些东西:此代码旨在用作库。

【问题讨论】:

  • 不要使用全局变量。总是以泪水告终。因可爱而获得 +1
  • @EdHeal:我认为这里介绍的两个选项的安全性没有任何实质性差异......
  • 我唯一能看到的是,在getset_list 版本中,没有人可以获取list 变量的地址并在你不期望它的时候乱用它。他们至少要经过getset_list
  • @OliCharlesworth - 考虑另一个库是否有全局变量list
  • 第一个参数 'nlist' 应该是 void* 类型。

标签: c global


【解决方案1】:

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

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

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

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

这两种方法都没有“免费”为您提供线程安全。但是,static 在函数内部的方法为您提供了一种实现线程安全的简单方法,而第一种方法则让调用者来处理对全局的同步访问。

【讨论】:

  • 使用静态全局变量是个好主意,只要项目中使用的其他文件(TU)符合这种做法。 IE。在其他文件中具有同名的非静态全局变量将产生编译器错误。
  • 感谢两位的回答。实际上,这段代码是用作图书馆的,它会改变你的答案吗?
  • @Antoninarto 如果库是供内部使用的,那么第二种和第三种方法都可以。如果是用于外部分发,我强烈建议使用第三种方法(即具有两个功能),因为它对于外人来说更直观。
猜你喜欢
  • 2014-07-04
  • 2021-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-13
  • 2010-09-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多