仅标头库中的全局变量

时间:2018-07-31 11:56:57

标签: c++ c linux global-variables header-files

我正在编写仅标头记录器库,并且需要全局变量来存储当前记录器设置(输出标志,日志文件描述符等)。我的想法:

  • 我无法将变量声明为extern,因为我无权访问翻译单元来定义变量
  • 我不能只在标头中定义全局变量,因为它会导致多个定义
  • 乍看之下,标头函数中的
  • 静态变量可能看起来不错,但事实是每个翻译单元都会拥有自己的“全局”变量副本,这很尴尬,而且肯定是错误的
  • 我也不认为在我的情况下可以避免使用全局变量(即使那是我想做的),因为我显然必须在日志函数调用之间以某种方式存储设置

有没有我没有考虑过的变体?还有其他方法可以使用 headers 来使用全局变量。

p.s。。我正在寻找兼容c99 / c ++ 11且可能存在gcc hack(gcc> = 4.8)的解决方案

2 个答案:

答案 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