[英]How to know if the main() is running?
上下文:在我的应用程序中,我有一些使用全局变量的函数。 由于全局变量的分配顺序未定义,我想在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 兼容。
如果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
。 考虑到main
调用本身的行为在 C++ 中未定义,使用std::atomic
可能有点矫枉过正。 如果您没有 C++11,那么volatile bool
就足够了:实际上,在该额外语句完成之前,您不在main
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.