header 仅库中的全局变量

Global variables in header only library

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

有没有我没有考虑过的变体?是否有任何其他方法可以仅使用 headers 来获得全局变量。

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

一种方法是将选项隐藏在 returns 对局部静态选项的引用的函数后面。只要不违反 ODR(例如,通过某些依赖于宏的函数更改),就可以保证局部静态变量在您的程序中是唯一的。作为一个简单的例子,这可以在头文件中:

inline bool& someOption()
{
   static bool opt = false;

   return opt;
}

并在一个翻译单元中:

someOption() = true;

将您的选项分组到一个结构中并将上述技术应用于该结构的实例可能会很有用。

请注意,此方法仅限于 C++(感谢 @rici 提供的提示),并且可能仅在使用 gcc 的 C 中意外有效。

按如下方式构建您的图书馆:

MyLibrary.h:

extern int foo;
extern int bar;
...
#ifdef MY_LIBRARY_IMPL
int foo;
int bar;
...
#endif

然后,在库文档中,指定在恰好一个翻译单元中,库的用户应该 #define MY_LIBRARY_IMPL 在包含头文件之前。