【发布时间】:2015-10-27 17:46:44
【问题描述】:
我正在构建一个 c++ 库,我需要为我的程序(和其他默认资源对象)初始化一个 openGL 上下文。在 main 之前调用的代码块中“隐藏 Init.code”是否是一种好习惯(考虑到现代 c++ 语义)?我不能使用静态变量,因为我需要按特定顺序初始化事物! (我无法在 openGLm 或 SDL 之前初始化纹理!)
这是我的代码:
#include <stdio.h>
#ifdef _MSC_VER // For msvc / msvc++ 2015
#define CCALL __cdecl
#pragma section(".CRT$XCU",read)
#define INITIALIZER(f) \
static void __cdecl f(void); \
__declspec(allocate(".CRT$XCU")) void (__cdecl*f##_)(void) = f; \
static void __cdecl f(void)
#elif defined(__GNUC__) for gcc / g++
#define CCALL
#define INITIALIZER(f) \
static void f(void) __attribute__((constructor)); \
static void f(void)
#endif
static void CCALL finalize(void)
{
/* Some king of delete / dispose here : like SDL_Quit, ... */
}
INITIALIZER(initialize)
{
/*
HERE IS THE STARTUP CODE ...
*/
}
【问题讨论】:
-
@ray 静态对象构造函数在main之前被调用。
-
@ray 函数可以在初始化全局变量和静态成员的过程中被调用。
-
@ray Are you sure?
-
我不知道这些宏在做什么。我会首先在 main 中调用一个 setup 函数,或者如果必须的话使用单例。您可以按所需的顺序进行单例设置。
-
如果您有一个实例化单个类的静态变量,您可以将所有初始化放入该类并完全控制初始化顺序。您只是无法控制该类相对于其他静态存储的初始化时间。