静态char * vs C ++ VS2005中的#define

时间:2010-08-06 17:16:14

标签: .net c++ visual-studio mfc

我有一个包含几个大型DLL的大型程序,这些DLL是用MFC和/ clr编译的。程序集中的全局FieldRVA条目限制为65535。如果它更多,加载器引发异常。我已经启用了String String Pooling(/ GF)。

我有很多代码,如:

static char *pSTRING_ONE = "STRING_ONE";

如果我用以下宏编译:

#define pSTRING_ONE  "STRING_ONE"

它大大减少了CLR元数据的字符串,所以我编译但后来我获得了使用#define的所有问题。

问题是:是否有另一种替代方法来更改静态字符* - > #define?

3 个答案:

答案 0 :(得分:0)

来自MSDN:

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

“/ GF编译器选项为每个唯一字符串创建一个可寻址部分。默认情况下,目标文件最多可包含65,536个可寻址部分。如果您的程序包含超过65,536个字符串,请使用/ bigobj编译器选项创建更多部分。“

听起来像/ bigobj是你的朋友......

答案 1 :(得分:0)

不是将字符串存储在程序的数据段中(因为你显然有一个字符串的TON),更好的是拥有一个包含它们的资源文件。然后只需动态分配一个字符串池并在程序启动时加载字符串资源文件。这应该完全消除有问题的问题。

如果这不是一个选项,假设它们包含在文件范围内,为什么要创建字符串static?这只是说“仅限文件范围”的C方式(在C ++中已弃用)。 const char *pSTRING_ONE = "STRING_ONE";将创建一个跨所有翻译单元共享的全局字符串。在这种情况下,beset只是创建一个包含所有字符串的文件,然后通过标题中的extern声明引用它们。

如果您不使用/GF会怎样?从Bukes的回答看来,通过汇集字符串,您将使编译器为每个字符串创建一个段。

答案 2 :(得分: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 Entries CLR字段的数量。谢谢你的帮助。