2013-03-15 77 views
2

所以我建立一個語法編譯器ANTLR和一些生成的代碼看起來是這樣的:靜態初始化順序失敗:相同的編譯單元?

const int ExampleClass::EXAMPLEVAR = OtherExample::OTHEREXAMPLEVAR; 

正如你可以看到這符合「靜態變量初始化順序的悲劇」的描述。

問題是,這個項目的目標之一是生成的C++代碼可以用作進一步語法編譯的基礎,儘可能容易。

這就是爲什麼在這種情況下「首次使用構造」範式可能是一個問題:區分靜態變量或靜態函數將會困難得多。

現在我已經閱讀了幾次,如果這些靜態變量在單個編譯單元中初始化,則問題不存在。

所以我有這種想法將所有這些衝突的情況移動到由它們的依賴關係排序的單獨的.cpp文件中。

這些相互矛盾的情況下,生成的代碼是這樣的:

//StaticInitializations.cpp 
#include "ExampleClass.h" 
#include "OtherExample.h" 
const int OtherExample::OTHEREXAMPLEVAR = 3; 
const int ExampleClass::CHANNEL_TYPE_TV = OtherExample::OTHEREXAMPLEVAR; 

我的問題是:將這項工作?

+6

有'[static-order-fiasco]'標籤?哇。 – NPE 2013-03-15 08:36:00

+0

爲什麼不能這樣工作?這應該。 – Pubby 2013-03-15 08:37:22

+0

技術問題:是的,在一個編譯單元中,所有對象都按照它們出現的順序進行初始化。另一個問題是:你能維持這個嗎? – 2013-03-15 08:39:51

回答

7

所以我有這種想法將所有這些衝突的情況移動到一個單獨的.cpp文件中,這些文件是由它們的依賴項排序的。

這將是一個需要更新其他部分代碼的文件,以及需要手動跟蹤和保持最新的代碼依賴關係(基本上是bug的來源)。

不要這樣做。

靜態初始化的順序可以被強制通過使用靜態函數來代替:

/* static */ 
int ExampleClass::EXAMPLEVAR() 
{ 
    static const int value = OtherExample::OTHEREXAMPLEVAR(); 
    return value; 
} 

這保證了值將返回/初始化尊重初始化順序依賴性。

+0

是的,你是對的。我的同事告訴我同樣的事情。但是,我假設這些初始化是一個架構問題。因此,我也會發出警告,以便這些結構可以被替換。 我認爲這種方法仍然可以作爲中介解決方案,所以團隊有足夠的時間來逐步解決這些問題。 儘管感謝您的回覆,但這是一個值得關注的問題;)但正如我在問題中所說的那樣:使用生成的代碼作爲進一步語法編譯的基礎會更困難。 – 2013-03-15 09:39:57

+0

你知道嗎?畢竟它可能是最好的答案。我仍然可以通過用#define常量註釋該函數來解決not-easily-identifiable-as-static-var部分。謝謝;)我接受這個答案。 – 2013-03-15 09:48:41