如何检查主函数是否被调用?

时间:2011-06-04 21:41:39

标签: c++ static main crt

我想编写一些依赖于静态变量值的代码。所以我想添加一些检查以消除从其他静态变量构造函数调用此代码的可能性。并且一次又一次地防止静态初始化命令惨败。例如:

static Foo foo = Foo();

// this function should be called ONLY from main program conrol flow
// ONLY after all static variable initialization was complete! ONLY!
int bar()
{
#ifdef _DEBUG
  if(! CRT_was_initialized_and_main_function_was_called ) ShowErrorMessage();
#endif
  if(foo.somefunction() == 2) return 0; else return -1;
}

//here inattentive programmer will caught error message during debug
const int barConstant = bar();

int main()
{
  //now all is fine
  const int barConstant = bar();
}

我该怎么办?如何在main函数之后检查我的函数是否被调用?

UPDATE:Foo对象有一个非常繁重的初始化代码,它可能很慢甚至抛出异常

更新2:这样做没有生命关注。 bar函数之前的注释大多数情况下工作正常。我对某种调试检查感兴趣,以便在程序的调试版本中惩罚不专心的程序员,而不是手动执行此操作。它可能是非标准的方式,就像调用一些疯狂的内置函数一样,只能在MSVC上运行。

5 个答案:

答案 0 :(得分:3)

创建一个全局bool标志,指示是否调用main,最初为false。 在main()内将其更改为true,并在此处进行更改。不是一个优雅的解决方案,而是解决一个非常奇怪的问题。

答案 1 :(得分:0)

我将使用此函数,mainCalled是一个全局布尔变量,默认情况下为false,并且在调用main时更改为true:

int bar()
{
    static bool called = 0;
    if (!mainCalled)
        ShowErrorMessage();
    if (called)
    {
        return -1;
    }
    called = true;
    //do somthing
    return 0;
}

答案 2 :(得分:0)

您可以在函数前简单地声明全局变量int main_called = 0;

在函数中检查变量是否为0,在main中将变量设置为1。

答案 3 :(得分:0)

没有可行的方法来做到这一点。您当然可以拥有自己的全局,在main中初始化,然后在main结束时取消初始化(不要忘记使用构造函数/析构函数来确保即使异常退出main也能正常工作)。

在MSVC上,一种更简单但不可移植的方式是#prgama init_seg。这为您提供了三个预设阶段,您可以自己创建更多阶段。

马丁

答案 4 :(得分:0)

对于单例模式而言,这不是一个比检查自己的初始化更好的情况吗?