2017-03-01 68 views
2

我目前面临的一个恼人的问题,用C++未初始化。C++类的静态成员的*静态库*

事实上,我甚至不知道我为什么不面对它在过去20年:(

在我目前的情况下,我们大量使用C++的可执行文件(主要是在Linux的嵌入式系统)静态用我们专有的静态库链接。 同时,我们也使用静态库的技术和优化的原因。

在过去几年中,的确,我以前虽然创建共享库...

于是我开始写一些带有静态类成员的类如下所示:

class Inner 
{ 
public: 
    Inner() 
    { 
    std::cout << "CTOR Inner" << std::endl; 
    } 
}; 

class A 
{ 
static Inner _inner; 

... 
}; 

// in the .cpp 

Inner A::_inner; 

/////////////////////// 

非常基本的用例,不是吗?

但在我的单元测试,用的lib联系,我看不到在控制台中std::cout声明。 然而,如果将我的内部类和A到可执行的源代码...它工作正常。

我敢肯定,这是一个非常基本的问题,我意识到,我从未遇到过在过去几年里。 这是一个与编译器有关的问题吗? 请注意,我在Windows和Linux上测试了这两种情况(Debian,Gcc 4.9)。

任何想法是值得欢迎的。

Z.

+0

全局变量只能保证在其含有翻译单元中的第一ODR使用的实体之前被初始化。如果你从不使用TU,你不能保证初始化全局变量。 –

+0

好的。所以我必须找到一个解决方法来“正确”强制它们的初始化...好。 – Zyend

+0

这是什么实际使用情况?我发现它非常符合期望,仅仅链接到一个静态库就没有副作用。如果我不使用某些东西,我不必为此付费,这是C和C++背后的设计原则。 – zett42

回答

7

你有实际使用A :: _的代码内以某种方式或部分将不包括在内。要么或者在该文件中使用其他内容。即使他们有可观察到的副作用,链接者也不必链接永远不会使用的翻译单元。

How to force inclusion of "unused" object definitions in a library

+0

你尊重你的昵称,真的!我所有的尊重。 –

+0

谢谢。那么......乍一看,没有“干净”的解决方案来解决这个问题。我不是的#pragma语句的粉丝,因为它会使整个事情脏越好... – Zyend

+0

我定义的一些宏,基本上让我“DECLARE_FILE(X)”,“DEFINE_FILE(x)将库头”/cpp,然后在我的程序主体中使用“USE_FILE(x)”。这些会创建一个静态的int,然后将它分配给主体。这导致翻译单位被包括在内,从而使注册发生。无论如何,不​​要特别回忆我所做的事情。 –