Rozważmy parę funkcji poniżej:Jak wymusić inicjalizację statycznej zmiennej lokalnej przed główną?
double MYAPI foo(double x) {
return x;
}
Register register_foo_([] {
return reg(&foo, "foo", ...); // function name repeated used
});
register_foo_
jest zmienną globalną, zainicjowany przed dllmain
, której konstruktor przyjmuje lambda że wielokrotnie odwołuje się do nazwy funkcji nad nim dosłownie. Byłoby wspaniale, gdyby kod rejestracyjny mógł poruszać się wewnątrz funkcji powyżej, aby zmniejszyć prawdopodobieństwo popełnienia błędu. Próbowałem:
double MYAPI foo(double x) {
static Register register_foo_([] {
return reg(&foo, "foo", ...); // static local does not initialize before dllmain
});
return x;
}
Jeśli powyższy kod działa, to może łatwo przekształcić go w makro sprawia, że korzystanie z __FUNCNAME__
. Czy istnieje sposób na wymuszenie inicjowania statycznej zmiennej lokalnej przed dllmain?
Jeśli wywołanie 'foo' nie mieć niepożądane skutki uboczne, można nazwać go na początku' dllmain' – Praetorian
Więc zasadniczo chcesz wywołać funkcję przed głównym? Czy byłam zdezorientowana? – Galik
@Praetorian To, co stara się osiągnąć, to automatyczne śledzenie zarejestrowanej funkcji. Więc wywołanie dllmain nie działa, ponieważ będę musiał wyraźnie wypisać nazwy funkcji. –