在我们的c++;程序? 我试图在我的C++程序中包括大字符串,它的大小是20598617个字符,我用定义< /代码>来实现它。我有一个包含此语句的头文件 #define "<huge string containing 20598617 characterd>"

在我们的c++;程序? 我试图在我的C++程序中包括大字符串,它的大小是20598617个字符,我用定义< /代码>来实现它。我有一个包含此语句的头文件 #define "<huge string containing 20598617 characterd>",c++,C++,我怎样才能成功地编译这个程序 平台:Windows 7嗯,将字符串存储在某种单独的资源中,然后加载?说真的,在嵌入式土地中,您可以将其作为单独的资源,而不是将其保存在RAM中。在windows上,我相信您可以使用.dll或其他外部资源来处理此问题。编译器的设计目的不是为您保存这么大的资源,它们将失败。您不能,也不能可靠地保存。即使它将编译,它也可能破坏运行库或操作系统假设,等等 如果您告诉我们您为什么要这样做,我们可以提供大量的替代方案。决定如何处理任意大的数据是编程的主要部分 编辑以添加: 我

我怎样才能成功地编译这个程序


平台:Windows 7

嗯,将字符串存储在某种单独的资源中,然后加载?说真的,在嵌入式土地中,您可以将其作为单独的资源,而不是将其保存在RAM中。在windows上,我相信您可以使用.dll或其他外部资源来处理此问题。编译器的设计目的不是为您保存这么大的资源,它们将失败。

您不能,也不能可靠地保存。即使它将编译,它也可能破坏运行库或操作系统假设,等等

如果您告诉我们您为什么要这样做,我们可以提供大量的替代方案。决定如何处理任意大的数据是编程的主要部分

编辑以添加:

我没有猜测,而是研究了:

在相邻字符串被 如果已连接,则不能连接字符串 超过16380个单字节 人物

大约一半的Unicode字符串 这个长度也会产生这个 错误

本页总结如下:

你可能想把它储存起来 中的大字符串文字(32K或更多) 自定义资源或外部文件

其他编译器怎么说

进一步编辑以添加:

我创建了这样一个文件:

char s[] = {'x','x','x','x'};
我不断将出现的
'x'
增加一倍,将每个文件作为
#include
文件进行测试


一个8388608字节的字符串成功;16777216字节失败,出现“堆空间不足”错误。

增加编译器堆空间。

将字符串存储到文件中,然后打开并读取它


通过这种方式,它更干净/更有条理[我假设您现在有一个名为blargh.h的文件,其中包含一个#Define…][/p>我怀疑您在字符串大小上遇到了设计限制。 大多数人真的认为一百万个字符足够长:-}

为了避免这种设计限制,我尽量不将整个内容放在一个文本字符串中。有人怀疑“定义宏观实体”也有类似的限制,我也不想把整个东西放在一个“定义”中

大多数C编译器将接受相当大的单个字符列表作为初始值设定项。如果你写信

char c[]={ c1, c2, ...  c20598617 };
有了CUI作为你的个人角色,你可能会成功。我见过GCC2应用程序中有200万个这样的元素(很明显,它们加载了某种类型的ROM映像)。您甚至可以根据自己的喜好将c_i分组为K=100、1000、10000的K个字符块,这实际上可能对编译器有所帮助

您还可以考虑通过压缩算法运行字符串, 通过上述方法将压缩结果放入C++文件中, 并在程序加载后解压缩。


我怀疑您可以将解压算法转换为几千字节。

如果字符串来自大型文本或二进制文件,您可能会幸运地使用
xxd-I
命令(根据Ira Baxter的回答,获取数组中的所有内容)或
bin2obj
命令的变体(要将所有内容放入
.o
文件,可以链接到程序中)

请注意,在这种情况下,字符串不能以null结尾

请参阅前面问题的答案,“”


(另外,顺便说一句:注意存在。)

这是一个非常古老的问题,但由于目前还没有明确的答案:C++11的原始字符串文本似乎可以完成这项工作

这在GCC 4.8上编译得很好:

#include <string>

std::string data = R"(
    ... <1.4 MB of base85-encoded string> ...
)";
#包括
std::string data=R“(
...  ...
)";

正如在本帖其他帖子中所说,这绝对不是处理大量数据的首选方式。

这是一个非常有趣的现象:其他人肯定也想这样做,我不知道为什么…@egrunin:Up vots只是表示“这是一个好问题”而不是“这也影响到我”。这不是一个好问题。@Snake:答案是“你不应该那样做”并不意味着问题不好。有时候,了解什么不应该做的最好方法就是先尝试一下。
#定义“foo”
没有意义。
#定义foo“foo”
may.Qts资源系统在我上次检查时也使用字符数组来存储二进制数据。+1.如果字符串是可合理压缩的,考虑到处理器的速度与硬盘的速度相比,读入并解压缩压缩后的表单可能比读入要快。@Charles:我的上一个变体答案是he正在将压缩的字符串构建到他的加载映像中。为什么要读取一个单独的文件,而加载程序将为您执行此操作,这正是我怀疑OP想要的?@Ira Baxter,无论数据是由操作系统加载程序还是程序本身执行的,都需要加载。如果压缩意味着程序启动速度加快一点,那将是一个错误efit。啊,是的,我假设Charles正在推动读取一个单独的文件。现在我看到我们都在同一页上。我使用压缩文件系统运行Windows正是因为这个原因:CPU真的很快,而磁盘不是。嗯,这实际上是一个明智的答案(对于一个疯狂的问题)但是它被否决了。上次我有一个数据段为12兆字节的C程序,用
ulimit
增加了内存限制,效果很好。@Snake-谢谢。我很高兴有人对他们的操作系统和编译器还有更高的期望。-1.这个问题本身就有价值。可能有可行的替代方案,但是了解将大数据直接整合到程序中的最佳方法也很有趣。我认为“为什么”并不重要。我相信当有人问一个精确的问题时(比如
#include <string>

std::string data = R"(
    ... <1.4 MB of base85-encoded string> ...
)";