【问题标题】:Increase string literal length limit增加字符串文字长度限制
【发布时间】:2017-07-24 08:30:44
【问题描述】:

我有很多大于 65535 字节的字符串文字。我不允许将这些字符串保存到单独的文件中,如何解决字符串限制?

https://stackoverflow.com/a/11488682/7821462

  • MSVC:2048

  • GCC:无限制(最多 100,000 个字符),但在 510 个字符后发出警告:

    String literal of length 100000 exceeds maximum length 509 that
    C90 compilers are required to support
    

【问题讨论】:

  • 一种选择是将字符串拆分为单个文件中的不同变量,然后使用指向这些变量的指针数组。它让你的生活更艰难,但这就是大自然
  • 适用于哪个编译器? gcc、MSVC 还是两者兼而有之?
  • 为什么你不能使用文件(或其他数据库)来存储文本?您有什么要求不允许这样做?
  • @Rakete1111 我需要先让字符串在 MSVC 上工作,然后再在 gcc 上工作。
  • @Someprogrammerdude 要求我需要将所有内容都放在一个可执行文件中。

标签: c++ string gcc visual-c++ compilation


【解决方案1】:

这些大字符串看起来更像是资源而不是代码,我会使用 Windows 二进制文件的资源部分(FindResource/LoadResource)和SO: embedding resources into linux executable 的答案将相同的数据插入到 linux 中。

【讨论】:

    【解决方案2】:

    您可以将文本字符串拆分为多个字符串。以下代码适用于 Visual Studio 2017:

    const char* p1 = "1234567890...";  // Very long (length > 65000)
    const char* p2 = "abcdefghij...";  // Very long (length > 65000)
    string s = p1;
    s += p2;
    cout << s.size() << endl;
    

    您必须将文本字符串写成多行,例如:

    const char* p = "This is a "
        "very long string...";
    

    实际上 Visual C++ 中的最大限制是 65535。这是编译器错误消息:

    致命错误 C1091:编译器限制:字符串长度超过 65535 个字节

    【讨论】:

      【解决方案3】:

      尝试使用数组。

      https://msdn.microsoft.com/en-us/library/81k8cwsz.aspx

      数组的最大大小由 size_t 定义。在头文件 STDDEF.H 中定义,size_t 是一个无符号整数,范围为 0x00000000 到 0x7CFFFFFF。

      【讨论】:

        【解决方案4】:

        Microsoft documentation 表示使用连接(即写"a" "b" "c" 而不是"abc")可以将限制增加到大约 64 KiB 字节。但这对于您的用例来说还不够。

        如果没有,您也许可以单独保存字符串,使用xxd -ixxd comes with [vim](http://www.vim.org/)), and#include` 将其转换为字节数组初始化器(但您必须手动添加空终止符)。

        【讨论】:

        • 我写过字符串字面量大于 65535 字节,我来看看数组初始化技术。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多