GC初期化と static initializer の問題

C++ で書かれる Scheme 関数を Environment に登録する際に、コンストラクタを利用した initializer を使っているのですがこれが GC の初期化と相性がよろしくない。
↓ initializer

void initialize##ClassName()                                                     \
{                                                                                \
    if (!g_gc_initialized)                                                       \
    {                                                                            \
        scheme_gc_init();                                                        \
        g_gc_initialized = true;                                                 \
    }                                                                            \
    procedures.add(                                                              \
        ::util::Pair<Variable*, Object*>(new Variable(name), new ClassName()));  \
}                                                                                \
static struct Wrapper##ClassName                                                 \
{                                                                                \
    Wrapper##ClassName(){initialize##ClassName();}                               \
} initializer_##ClassName;                                                       \

GC の初期化処理が実行された後にのみ new を呼んで OK なのでいろいろと初期化の順番に気を遣わなければならない。
今までは適当なフラグを利用して

if (!g_gc_initialized)
{
    gc_init()
    g_gc_initialized = true;
}

などとがんばって制御していたのだけど、あまりにいびつなので、 Environment への登録をコードをスクリプトなどで生成する方法を試してみようと思う。