C++ 如何知道main()是否正在运行?

C++ 如何知道main()是否正在运行?,c++,c++03,C++,C++03,上下文: 在我的应用程序中,我有一些使用全局变量的函数。由于全局变量的分配顺序未定义,我想在main函数运行之前禁止调用这些函数。目前,我只通过Doxygen中的\attention来记录它,但我想添加一个断言 我的问题: 是否有一种优雅的方法可以知道main函数尚未运行 示例(uniqid.cpp): #include <boost/thread.hpp> #include <cassert> unsigned long int uid = 0; boost::mute

上下文: 在我的应用程序中,我有一些使用全局变量的函数。由于全局变量的分配顺序未定义,我想在
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;
}
有更好的方法吗


请注意,我不能使用C++11,因为我必须与gcc 4.1.2兼容。

如果
静态std::atomic s以及一点切换
struct

struct toggle
{
    toggle(std::atomic<bool>& b) : m_b(b)
    {
        m_b = true;
    }   
    ~toggle()
    {
        m_b = false;
    }
    std::atomic<bool>& m_b;
};
struct-toggle
{
切换(标准::原子&b):m_b(b)
{
m_b=真;
}   
~toggle()
{
m_b=假;
}
std::原子与分子生物学;
};
然后,在
main
中,写入
切换t(s)
作为第一条语句。这是将引用作为成员变量是一个好主意的实例之一


s
然后可以告诉您是否在
main
中。使用<代码> STD::原子可能会被忽略,因为C++中的代码>主< <代码>调用本身是未定义的。如果您没有C++11,那么
volatile bool
就足够了:实际上,在额外语句完成之前,您不在
main
中。

为什么不将这些变量封装到一个类中,创建一个实例?是的,搜索单例模式。@Michael,那么你怎么知道这个对象是否被创建了呢?@Michael如果它是全局可访问的,它(或任何提供访问它的设施)有一个位置,不管它是否被构造,只有该位置可能包含垃圾。@Michael该方法仍然需要检查对象是否以前创建过,因此它不会每次都重新创建它,它只能存储在静态/全局中,而静态/全局中也可能包含垃圾。我不理解确切的行为。为什么在调用
main()
之前我可以确定
s
是否为
false
?标准保证对于
static
s,那么我应该在哪里声明
static volatile bool?作为外部变量?那么其他函数/类无法访问它?哼。如果您必须防止恶意使用代码库,那么最好的选择是让
main
实例化您完全控制的类的实例。
struct toggle
{
    toggle(std::atomic<bool>& b) : m_b(b)
    {
        m_b = true;
    }   
    ~toggle()
    {
        m_b = false;
    }
    std::atomic<bool>& m_b;
};