2010-08-06 77 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