在C中做一个单件

在C中做一个单件,c,C,也许这是一个愚蠢的问题,答案只是“使用全局”,但我想知道单例的概念通常是如何在C中实现的。例如,假设我有一组代理,它们在程序执行过程中永远不会改变,但每个函数/线程/任何需要访问它的东西。我在想这样做: typedef struct proxy { int fails; char http[50]; char https[50]; } Proxy; Proxy PROXIES[] = { {.fails=0, .http="http://...&quo

也许这是一个愚蠢的问题,答案只是“使用全局”,但我想知道单例的概念通常是如何在C中实现的。例如,假设我有一组代理,它们在程序执行过程中永远不会改变,但每个函数/线程/任何需要访问它的东西。我在想这样做:

typedef struct proxy {
    int fails;
    char http[50];
    char https[50];
} Proxy;

Proxy PROXIES[] = {
    {.fails=0, .http="http://...", .https="https://..."},
    {.fails=-1}; // use sentinel for sizeof?
};

上述方法是否有效?如果不是,在C中有哪些方法可以做到这一点?

对于简单对象,您的解决方案是非常好的。但是,对于更复杂的系统,可能需要进行一些初始化:

标题:

typedef struct proxy { ... } Proxy;
const Proxy *get_proxy(void);
C文件:

const Proxy *get_proxy(void) {
  static int initialized = 0;
  static Proxy proxy;
  if (!initialized) {
    // ... do initialization
    initialized = 1;
  }
  return &proxy;
}

这回答了你的问题吗?在
h
文件顶部的某个地方声明您的代码,该文件包含在所有地方,您将获得一个单例。另外,您将获得编译器对它的支持,比如名称冲突。您当前发布的代码不是线程安全的。如果多个线程同时调用
get\u proxy()
,您将在系统中引入竞争条件。@tstanisl——一件小事,但是为什么您要
*get\u proxy()
而不是
*get\u proxy(void)
——第二种方法不是更正确吗?@carl.hiass,laziness。。。你完全正确。谢谢你指出这一点