2010-08-06 66 views
1

我有一個大的程序與幾個大的DLL與MFC和/ clr編譯。程序集中有65535個全局FieldRVA條目的限制。如果是更多的加載器引發異常。我已經有啓用字符串池(/ GF)。靜態char * vs#定義在C + + VS2005

我有很多的代碼,如:

static char *pSTRING_ONE = "STRING_ONE"; 

如果我編譯難熬宏如:

#define pSTRING_ONE "STRING_ONE" 

它大大降低了CLR元數據字符串,所以我編譯,但後來我得到大家使用#define的問題。

問題是:是否有另一種方法來改變靜態char * - > #define?

+0

使用'#define'的確切問題是什麼? – 2010-08-06 17:27:22

+0

問題在於宏可以重新定義。我也不確定對程序大小的影響。 – tgrantges 2010-08-06 17:31:52

回答

0

不幸的是,我們問題的最佳解決方案是在類中包含有問題的代碼。

// Old Way 
static char *pSTRING_ONE = "STRING_ONE"; 

class CFieldDefs 
{ 
    public: 
    static char *pSTRING_ONE; 
} 

char *CFieldDefs::pSTRING_ONE = "STRING_ONE"; 

用法:

CFieldDefs:pSTRING_ONE; 

即使改變是相當繁瑣的,它大大降低了DLL中fieldRVA項CLR字段數。感謝你的幫助。

0

從MSDN:

http://msdn.microsoft.com/en-us/library/s0s0asdt.aspx

「的/ GF編譯器選項爲每個唯一字符串的尋址區間,默認情況下,目標文件可以包含多達65,536個可尋址部分如果你的程序中包含。超過65,536個字符串,請使用/ bigobj編譯器選項創建更多節。「

聽起來/ bigobj是你的朋友在這裏......

+0

不確定這是否是解決方案。它似乎是一個程序集/ DLL中的條目數量的問題。嘗試在運行時加載程序集/ DLL時引發異常。不是編譯時間。 – tgrantges 2010-08-06 18:29:54

0

而不是在你的程序的數據段存儲的字符串(因爲你顯然有一個字符串的TON),更好的是有一個資源文件包含它們。然後只需動態分配一個字符串池並在程序啓動時加載字符串資源文件。這應該完全消除有問題的問題。

如果這不是一個選項,假設這些都包含在文件範圍內,爲什麼你要製作字符串static?這只是說「僅文件範圍」的C方式(並且在C++中已棄用)。 const char *pSTRING_ONE = "STRING_ONE";會創建一個跨所有翻譯單元共享的全局字符串。在這種情況下,beset只是創建一個包含所有字符串的文件,然後通過頭文件中的extern聲明引用它們。

如果你不使用/GF會發生什麼?從Bukes的回答可以看出,通過彙集字符串,可以使編譯器爲每個字符串創建一個段。

+0

我同意在長時間調整這些字符串和變量(它們是表字段名稱和大小)的代碼是最好的長期方法。然而,這個遺留系統有數百個字段跨越了一百個表,並引用了數百個源文件。 所以我正在尋找一個更快的解決方案... – tgrantges 2010-08-06 19:39:08