【发布时间】:2012-03-17 06:45:45
【问题描述】:
我正在用 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
}
它按预期构建和工作,没有警告消息,但不是 LTO。
我收到大量抱怨类型匹配的警告消息,我想知道是否有解决方法,因为它让我难以找到其他“真实”警告或错误消息。
有什么建议吗?
【问题讨论】:
-
您真正想做什么?在下面对 Pubby 的回答的 cmets 中,您说您要初始化多个相同类型的对象。对我来说,您似乎希望在让实现调用其他构造函数之前初始化与 C++ 支持相关的结构,例如堆。但这听起来不像你正在尝试的。另外,您会收到关于哪种“类型匹配”的警告?
-
@Potatoswatter 很多
warning: type of ‘xxx’ does not match original declaration [enabled by default]的东西。这是因为实际的类型不是 test 而是 char[]。我以为我可以禁用静态构造函数,但似乎没有办法做到这一点。 -
啊,我明白了。你应该做的是
char fake_inst1[ sizeof (test) ]; test *const inst1 = reinterpet_cast< test * >( fake_inst1 ); -
禁用静态构造函数的方法是将变量放入包装函数中。只有第一次调用包装器时才会调用构造函数。这是非常惯用的,并且总是优于将全局置于命名空间范围内。但是,在您的情况下,您需要确保在运行时支持用于实现“仅第一次”功能的多线程操作。
-
无论您是否找到抑制警告的方法,恕我直言,这是唯一真正正确处理具有非平凡 c' 的全局/静态对象的方法托/托。这样,您不仅可以控制它们的初始化/销毁顺序,还可以实际控制程序流程。例如,您可以从它们的初始化代码中抛出异常并适当地捕获它们。所有这一切都不会影响性能。
标签: c++ constructor c++11