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定义了code>以及一点切换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;
};