理论:getter / setter函数还是全局变量? C

时间:2014-02-09 00:53:30

标签: c global

我目前正在编写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 个答案:

答案 0 :(得分:4)

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

另一方面,第二种方法允许您决定在尚未初始化变量时要执行的操作,因此如果您需要使用全局状态,则首选第二种方法。

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

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

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