.net C+中的静态字符*vs#define+;VS2005

.net C+中的静态字符*vs#define+;VS2005,.net,c++,visual-studio,mfc,.net,C++,Visual Studio,Mfc,我有一个带有几个大型DLL的大型程序,它们是用MFC和/clr编译的。程序集中的全局字段RVA条目数限制为65535个。如果更大,加载程序将引发异常。我已经启用了字符串池(/GF) 我有很多代码,比如: static char *pSTRING_ONE = "STRING_ONE"; 如果我使用宏进行编译,例如: #define pSTRING_ONE "STRING_ONE" 它大大减少了CLR元数据的字符串,因此我编译了CLR元数据,但随后我得到了使用#define的所有问题 问题是:

我有一个带有几个大型DLL的大型程序,它们是用MFC和/clr编译的。程序集中的全局字段RVA条目数限制为65535个。如果更大,加载程序将引发异常。我已经启用了字符串池(/GF)

我有很多代码,比如:

static char *pSTRING_ONE = "STRING_ONE";
如果我使用宏进行编译,例如:

#define pSTRING_ONE  "STRING_ONE"
它大大减少了CLR元数据的字符串,因此我编译了CLR元数据,但随后我得到了使用
#define
的所有问题

问题是:除了从MSDN更改静态字符*->#define?

之外,还有其他替代方法吗:

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


听起来/bigobj是您在这里的朋友…

与其将字符串存储在程序的数据段中(因为您显然有大量字符串),不如使用包含它们的资源文件。然后动态分配一个字符串池,并在程序启动时加载字符串资源文件。这应该完全消除这个问题

如果这不是一个选项,假设它们包含在文件范围内,那么为什么要使字符串
成为静态的
?这只是C语言中“仅限文件范围”的说法(在C++中已被弃用)<代码>常量字符*pSTRING\u ONE=“STRING\u ONE”
将创建一个在所有翻译单元中共享的全局字符串。在本例中,麻烦在于只创建一个包含所有字符串的文件,然后通过头中的外部声明引用它们


如果不使用
/GF
,会发生什么情况?从Bukes的回答看来,通过合并字符串,编译器会为每个字符串创建一个段。

不幸的是,解决问题的最佳方法是将有问题的代码包含在一个类中

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

用法:

CFieldDefs:pSTRING_ONE;

尽管更改非常繁琐,但它大大减少了DLL中fieldRVA条目CLR字段的数量。感谢您的帮助。

使用
#define
时您面临的确切问题是什么?问题是宏可以重新定义。我也不确定对程序大小的影响。不确定这是解决方案。程序集/DLL中的条目数似乎有问题。尝试在运行时加载程序集/DLL时引发异常。我同意,从长远来看,调整这些字符串和变量的代码(它们是表字段名和大小)是最好的长期方法。但是,这个遗留系统有数百个字段,跨越100多个表,并从数百个源文件中引用。所以我在寻找一个更快的解决方案。。。
CFieldDefs:pSTRING_ONE;