2017-03-01 92 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,然後將它分配給主體。這導致翻譯單位被包括在內,從而使註冊發生。無論如何,不​​要特別回憶我所做的事情。 –