上下文:
在我的应用程序中,我有一些使用全局变量的函数。由于全局变量的分配顺序未定义,我想在main
函数运行之前禁止调用这些函数。目前,我只在Doxygen中用\attention
记录它,但我想添加一个断言。
我的问题:
是否有一种优雅的方式可以知道main
函数尚未运行?
示例(uniqid.cpp):
#include <boost/thread.hpp>
#include <cassert>
unsigned long int uid = 0;
boost::mutex uniqid_mutex;
unsigned long int uniquid()
{
assert(main_is_running() && "Forbidden call before main is running");
boost::mutex::scoped_lock lock(uniqid_mutex);
return ++uid;
}
我的第一个(丑陋的)想法: 我的第一个想法是通过检查具有特定值的另一个全局变量。那么在初始化之前在变量中具有该值的概率非常小:
// File main_is_running.h
void launch_main();
bool main_is_running();
// File main_is_running.cpp
unsigned long int main_is_running_check_value = 0;
void launch_main()
{
main_is_running_check_value = 135798642;
}
bool main_is_running()
{
return (main_is_running_check_value == 135798642);
}
// File main.cpp
#include "main_is_running.h"
int main()
{
launch_main();
// ...
return 0;
}
有更好的方法吗?
请注意,我无法使用C ++ 11 ,因为我必须与gcc 4.1.2兼容。
答案 0 :(得分:1)
如果定义了static std::atomic<bool> s;
,还有一点切换struct
:
struct toggle
{
toggle(std::atomic<bool>& b) : m_b(b)
{
m_b = true;
}
~toggle()
{
m_b = false;
}
std::atomic<bool>& m_b;
};
然后,在main
中,将toggle t(s);
写为第一个语句。这是将引用作为成员变量的一个例子之一。
s
可以告诉您是否在main
。鉴于std::atomic
调用自身的行为在C ++中是 undefined ,使用main
可能是过度的。如果你没有C ++ 11,那么volatile bool
就足够了:有效你的main
不在NaN
之前。