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