如何在main之前强制初始化静态局部变量?

Can*_*hiu 5 c++ c++11

考虑下面的一对函数:

double MYAPI foo(double x) { 
     return x; 
}
Register register_foo_([] { 
     return reg(&foo, "foo", ...); // function name repeated used
});
Run Code Online (Sandbox Code Playgroud)

register_foo_是一个全局变量,在之前初始化dllmain,其构造函数采用一个lambda,它重复引用它上面的函数名称.如果注册代码可以在上面的函数内移动以减少出错的可能性,那将是很好的.我试过了:

double MYAPI foo(double x) { 
     static Register register_foo_([] { 
          return reg(&foo, "foo", ...); // static local does not initialize before dllmain
     });
     return x; 
}
Run Code Online (Sandbox Code Playgroud)

如果上面的代码有效,那么我可以很容易地把它变成一个利用它的宏__FUNCNAME__.有没有办法强制register_foo_在dllmain之前初始化静态局部变量?

Que*_*tin 1

我想您想要实现类似于以下的语法:

DEFINE_FUNC(void, foo, (double x)) {
    return x;
}
Run Code Online (Sandbox Code Playgroud)

...并自动生成样板。Register如果您在声明的帮助下引入上述函数,这实际上非常简单:

#define DEFINE_FUNC(Ret, name, args)   \
    Ret name args;                     \
    Register register_##name##_([] {   \
        return reg(&name, #name, ...); \
    });                                \
    Ret name args
Run Code Online (Sandbox Code Playgroud)