Rob*_*son 0 c++ initialization
如果我有一个头文件foo.h和一个源文件foo.cpp,并且foo.cpp包含以下内容:
#ifdef WIN32
class asdf {
asdf() { startup_code(); }
~asdf() { cleanup_code(); }
};
asdf __STARTUP_HANDLE__
#else
//unix does not require startup or cleanup code in this case
#endif
Run Code Online (Sandbox Code Playgroud)
但是foo.h没有定义类asdf,比如我有一个应用程序bar.cpp:
#include "foo.h"
//link in foo.lib, foo.dll, foo.so, etc
int main() {
//do stuff
return 0;
}
Run Code Online (Sandbox Code Playgroud)
如果bar.cpp是在WIN32平台上编译的,那么asdf()和~asdf()会在适当的时候(分别在main()之前和程序退出时)调用,即使在foo.h中没有定义类asdf也是如此. ,但通过foo.cpp链接?
是的 - 但要非常小心.asdf初始化静态对象(如对象)的顺序是未定义的.因此,如果任何其他对象之前尝试引用您的对象,则它是未定义的行为main().
此外,__STARTUP_HANDLE__不是有效的标识符.任何标识符(甚至宏)都不允许使用双下划线,也不允许使用单引号后跟大写字母.