控制静态对象构造函数的顺序

Inb*_*ong 6 c++ constructor c++11

我正在用c ++ 11编写一个小内核,并且在创建任何其他静态对象之前必须构造两个具有相同类型的实例.

我写的代码如下:

// test.hpp
class test {
  // blahblah...
};

// test.cpp
typedef char fake_inst[sizeof(test)] __attribute__((aligned(alignof(test))));

fake_inst inst1;
fake_inst inst2;

// main.cpp
extern test inst1;
extern test inst2;

int kmain() {
    // copy data section

    // initialize bss section

    new (&inst1) test();
    new (&inst2) test();

    // call constructors in .init_array

    // kernel stuffs
}
Run Code Online (Sandbox Code Playgroud)

它构建并按预期工作,没有任何警告消息,但LTO没有.

我收到大量的警告消息抱怨类型匹配,我想知道是否有一个解决方法,因为它让我困惑,找到其他"真正的"警告或错误消息.

有什么建议吗?

Joh*_*itb 0

也许像这样?

// ... .h
template<typename T>
union FakeUnion {
  FakeUnion() {}
  ~FakeUnion() {}

  T inst;
};

extern FakeUnion<test> inst1_;
extern FakeUnion<test> inst2_;
static constexpr test& inst1 = inst1_.inst;
static constexpr test& inst2 = inst2_.inst;
// ... .h end

// ... .cpp
FakeUnion<test> inst1_;
FakeUnion<test> inst2_;
// ... .cpp end
Run Code Online (Sandbox Code Playgroud)

之内main,你可以接着说new (&inst1) test;。现在它不应该再发出有关类型不一致违规的警告,因为与您的代码不同,此代码不包含在不同文件中具有不同类型的变量。