我正在编写仅标头记录器库,并且需要全局变量来存储当前记录器设置(输出标志,日志文件描述符等)。我的想法:
有没有我没有考虑过的变体?还有其他方法可以使用 headers 来使用全局变量。
p.s。。我正在寻找兼容c99 / c ++ 11且可能存在gcc hack(gcc> = 4.8)的解决方案
答案 0 :(得分:3)
一种方法是将选项隐藏在返回对本地静态选项的引用的函数后面。只要不违反ODR(例如,通过某些宏相关的函数更改),就可以保证局部静态变量在程序中是唯一的。举个简单的例子,它可以在头文件中:
inline bool& someOption()
{
static bool opt = false;
return opt;
}
以及翻译单元中的
someOption() = true;
将选项组合成一个结构并将上述技术应用于该结构的一个实例可能会很有用。
请注意,这种方法仅限于C ++(由于使用@rici作为提示),并且可能仅在使用gcc的C语言中偶然地实现。
答案 1 :(得分:3)
结构如下:
MyLibrary.h:
extern int foo;
extern int bar;
...
#ifdef MY_LIBRARY_IMPL
int foo;
int bar;
...
#endif
然后,在库文档中,指定在仅一个翻译单元中,库用户在包含头文件之前应#define MY_LIBRARY_IMPL
。