2010-11-12 49 views
3

看來Adobe Alchemy沒有運行全局構造函數。下面是一些簡單的測試代碼:用鍊金術打破全球?

#include <stdio.h> 

class TestClass { 
public: 
    TestClass(const char message[]) { 
     printf("hello %s \n", message); 
    } 
}; 

TestClass global("global"); 

int main(int argc, char **argv) { 
    TestClass local("local"); 
    printf("in main\n"); 
    return 0; 
} 

當與本地的gcc編譯它輸出:

hello global 
hello local 
in main 

當鍊金術GCC編譯它輸出:

hello local 
in main 

這個問題打破了大量的代碼,特別是UnitTest++(這取決於全局變量初始化以使其自動測試列表功能工作)。

我真的很想深究這一點。這是一個錯誤還是一個功能,只是沒有及時實現發佈?是否有可能解決方法?

編輯:Adobe論壇上的相關帖子是here

回答

2

我遇到了同樣的問題。據我所知,這似乎是這樣的:

即使一個類在初始化過程中的任何一點嘗試動態分配,每個類類型的靜態變量和全局變量都將默默無法初始化。大概這是因爲用於動態內存的ByteBuffer尚不可用。我希望鍊金術會更加清楚它的錯誤信息,因爲目前它就像是一串舊時的聖誕燈,其中一個死燈泡會導致整個燈串關閉。

對於解決方法,一旦發現有問題的對象,您需要以某種方式將其初始化推遲到運行時。想到的三種技術是指針,懶惰的評估函數或對使用新位置初始化的緩衝區的引用。

指針

// `global` is now a pointer 
TestClass *global; 

// all global variable initialization is found here now 
void init_globals() { 
    global = new TestClass("global"); 
} 

int main(int argc, char **argv) { 
    // this needs to be explicitly called at the start Alchemy 
    init_globals(); 

然後,您需要重構你的代碼中,global每一次出現轉變爲(*global)

功能

// `global` is now a function 
TestClass& global() { 
    // static locals are initialized when their functions are first called 
    static TestClass global_("global"); 
    return global_; 
} 

現在你需要global()更換的global每一次出現。值得注意的是,這是這三種技術中唯一不需要明確調用init_globals的技術。我建議這樣,除非名稱更改爲global()麻煩出於某種原因......在這種情況下:

安置新

// a memory buffer is created large enough to hold a TestClass object 
unsigned char global_mem[sizeof(TestClass)]; 
// `global` is now a reference. 
TestClass& global = *(TestClass*)(void*)global_mem; 

void init_globals() { 
    // this initializes a new TestClass object inside our memory buffer 
    new (global_mem) TestClass("global"); 
} 

int main(int argc, char **argv) { 
    init_globals(); 

這種方法的優點是你不需要改變任何其他代碼,因爲global仍然只叫global。不幸的是,保持一個init_globals函數可能會很麻煩。


編輯:
作爲以後的問題發現,除了動態分配,包含靜態當地人也功能無法鍊金術的初始化過程中調用。

+0

對於「這就像一串舊時聖誕燈」,因爲這正是它的原因。 :) – paleozogt 2010-11-17 18:24:54