header 仅库中的全局变量
Global variables in header only library
我正在编写一个 header-only 记录器库,我需要全局变量来存储当前记录器设置(输出标志、日志文件描述符等)。我的想法:
- 我无法将变量声明为外部变量,因为我无权访问翻译单元来定义它们
- 我不能只在 header 中定义全局变量,因为它会导致多个定义
- header函数中的静态变量乍一看似乎很好,但事实是每个翻译单元都会有自己的'global'变量副本,这很尴尬而且肯定错
- 我也不认为在我的情况下可以避免全局变量(即使那是我想做的)因为我显然必须在日志函数调用之间以某种方式存储设置
有没有我没有考虑过的变体?是否有任何其他方法可以仅使用 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
在包含头文件之前。
我正在编写一个 header-only 记录器库,我需要全局变量来存储当前记录器设置(输出标志、日志文件描述符等)。我的想法:
- 我无法将变量声明为外部变量,因为我无权访问翻译单元来定义它们
- 我不能只在 header 中定义全局变量,因为它会导致多个定义
- header函数中的静态变量乍一看似乎很好,但事实是每个翻译单元都会有自己的'global'变量副本,这很尴尬而且肯定错
- 我也不认为在我的情况下可以避免全局变量(即使那是我想做的)因为我显然必须在日志函数调用之间以某种方式存储设置
有没有我没有考虑过的变体?是否有任何其他方法可以仅使用 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
在包含头文件之前。