我试图在我的c ++程序中包含大字符串,它的大小是20598617个字符,我#define用来实现它.我有一个包含此语句的头文件
#define "<huge string containing 20598617 characterd>"
Run Code Online (Sandbox Code Playgroud)
当我尝试编译程序时,我得到错误 fatal error C1060: compiler is out of heap space
我尝试了以下命令行选项但没有成功
/Zm200
/Zm1000
/Zm2000
Run Code Online (Sandbox Code Playgroud)
如何成功编译此程序?
平台:Windows 7
egr*_*nin 19
你不能,不可靠.即使它会编译,它也可能会破坏运行时库或操作系统假设,等等.
如果你告诉我们你为什么要这样做,我们可以提供很多选择.决定如何处理任意大数据是编程的主要部分.
编辑添加:
我没有猜测,而是查看了MSDN:
在连接相邻字符串之前,字符串不能超过16380个单字节字符.
大约一半长度的Unicode字符串也会生成此错误.
该页面的结论是:
您可能希望在自定义资源或外部文件中存储特别大的字符串文字(32K或更多).
其他编译器说什么?
进一步编辑添加:
我创建了一个这样的文件:
char s[] = {'x','x','x','x'};
Run Code Online (Sandbox Code Playgroud)
我不断地将'x'每个测试作为#include文件进行测试.
一个8388608字节的字符串成功; 16777216个字节失败,出现"堆外空间"错误.
Ira*_*ter 14
我怀疑你遇到了字符串大小的设计限制.大多数人真的认为一百万个字符足够长: - }
为了避免这样的设计限制,我尽量不把整个东西放到一个文字字符串中.由于怀疑#define宏体同样具有相似的限制,我也不会尝试将整个事物放在一个#define中.
大多数C编译器都会接受相当大的单个字符列表作为初始化器.如果你写
char c[]={ c1, c2, ... c20598617 };
Run Code Online (Sandbox Code Playgroud)
如果c_i是你的个人角色,你可能会成功.我见过GCC2应用程序,其中有200万个这样的元素(显然它们正在加载某种类型的ROM映像).您甚至可以将c_i分组为K个字符的块,K = 100,1000,10000,以满足您的口味,这可能实际上有助于编译器.
您还可以考虑通过压缩算法运行字符串,通过上述任何方法将压缩结果放入C++文件中,并在加载程序后解压缩.我怀疑你可以将减压算法变成几千字节.
嗯,将字符串存储在某种单独的资源中并加载它?说真的,在嵌入式土地中,您可以将其作为单独的资源而不是将其保存在RAM中.在Windows上,我相信你可以使用.dll或其他外部资源来为你处理这个问题.编译器不是为您提供这种大小的资源而且会失败.
增加编译器堆空间.
如果你的字符串来自一个大的文本或二进制文件,你可能会运气xxd -i命令(根据Ira Baxter的答案获取数组中的所有内容)或bin2obj命令的变体(将所有内容都放入.o可以链接到的文件中)该程序).
请注意,在这种情况下,字符串可能不会以空值终止.
请参阅前面问题的答案," 如何在构建时将文件的内容放入我的C++字符串中? "
(另外,请注意:.xbm格式化的存在.)