如何检查是否调用了主函数

How to check whether main function was called?

本文关键字:调用 函数 是否 何检查 检查      更新时间:2023-10-16

我想写一些依赖于静态变量值的代码。因此,我想添加一些检查,以消除从其他静态变量构造函数调用此代码的可能性。并永远防止静态初始化顺序的惨败。例如:

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();
}

我该怎么做?如何检查我的函数是否在主函数被调用后被调用?

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

更新2:这样做没有生命问题。大多数情况下,条形图功能都很好。我感兴趣的是某种调试检查,以惩罚程序调试版本中疏忽大意的程序员,而不是手动执行。它可能是非标准的,比如调用一些疯狂的内置函数,而这些函数只能在MSVC上工作。

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

i会使用这个函数,mainCalled是一个全局布尔变量,默认情况下为false,当调用main时改为true:

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

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

在函数中,您检查变量是否为0,而在主函数中,则将变量设置为1。

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

在MSVC上,一种更简单但不可移植的方法是#prgama-init_seg。这给了你三个预设的阶段,还有更多你可以自己创造的阶段。

Martyn

对于可以检查自己初始化的单例模式来说,这不是一个很好的例子吗?