如何在C ++源代码中包含极长的文字?

时间:2010-03-20 05:03:11

标签: c++ long-integer literals

我有点问题。基本上,我需要在我的程序中存储大量列入白名单的条目,我想直接包含这样的列表 - 我不想分发其他库等等,我不想将字符串嵌入到Win32资源中,原因很多,我现在不想进入。

我只是将我的大白名单包含在我的.cpp文件中,并出现此错误:

1>ServicesWhitelist.cpp(2807): fatal error C1091: compiler limit: string exceeds 65535 bytes in length

字符串本身大约是VC ++允许限制的两倍。在程序中包含如此大的文字的最佳方法是什么?

修改

我正在存储这样的字符串:

const std::wstring servicesWhitelist
(
 L".NETFRAMEWORK|"
 L"_IOMEGA_ACTIVE_DISK_SERVICE_|"
 L"{6080A529-897E-4629-A488-ABA0C29B635E}|"
 L"{834170A7-AF3B-4D34-A757-E05EB29EE96D}|"
 L"{85CCB53B-23D8-4E73-B1B7-9DDB71827D9B}|"
 L"{95808DC4-FA4A-4C74-92FE-5B863F82066B}|"
 L"{A7447300-8075-4B0D-83F1-3D75C8EBC623}|"
 L"{D31A0762-0CEB-444E-ACFF-B049A1F6FE91}|"
 L"{E2B953A6-195A-44F9-9BA3-3D5F4E32BB55}|"
 L"{EDA5F5D3-9E0F-4F4D-8A13-1D1CF469C9CC}|"
 L"2WIREPCP|"
//About 3800 more lines
);

EDIT2 它在运行时以类似于此的方式使用:

static const boost::wregex servicesWhitelistRegex(servicesWhitelist);
std::wstring service;
//code to populate service
if (!boost::regex_match(service, servicesWhitelistRegex))
 //Do something to print service

5 个答案:

答案 0 :(得分:8)

阵列怎么样? (你只会在每个元素的法定限制之后加上逗号)

const std::wstring servicesWhitelist[] = {
 L".NETFRAMEWORK|",
 L"_IOMEGA_ACTIVE_DISK_SERVICE_|",
 L"{6080A529-897E-4629-A488-ABA0C29B635E}|",
 L"{834170A7-AF3B-4D34-A757-E05EB29EE96D}|",
 L"{85CCB53B-23D8-4E73-B1B7-9DDB71827D9B}|",
 L"{95808DC4-FA4A-4C74-92FE-5B863F82066B}|",
 L"{A7447300-8075-4B0D-83F1-3D75C8EBC623}|",
 L"{D31A0762-0CEB-444E-ACFF-B049A1F6FE91}|",
 L"{E2B953A6-195A-44F9-9BA3-3D5F4E32BB55}|",
 L"{EDA5F5D3-9E0F-4F4D-8A13-1D1CF469C9CC}|",
 L"2WIREPCP|",
...
};

您可以使用以下语句来获取组合字符串。

accumulate(servicesWhitelist, servicesWhitelist+sizeof(servicesWhitelist)/sizeof(servicesWhitelist[0]), "")

答案 1 :(得分:4)

假设您实际上需要存储一个字符串> 64k字符(即上述所有“只是不要那样做”的解决方案不适用。)

让MSVC高兴,而不是说:

const char *foo = "abcd...";

您可以将> 64k字符串转换为以整数表示的单个字符:

const char foo[] = { 97, 98, 99, 100, ..., 0 };

每个字母已转换为ascii等效字母(97 =='a'等),并且最后添加了NUL终结符。

MSVC2010至少对此感到满意。

答案 2 :(得分:2)

如果它只是限制的两倍,那么显而易见的解决方案似乎是存储2(或3)个这样的字符串。 :)我确信你在运行时读取它们的代码可以很容易地处理它。

编辑:您出于某种原因需要使用正则表达式吗?你能将大字符串拆分成单个标记列表并进行简单的字符串比较吗?

答案 3 :(得分:0)

我声称对此不予赞誉:

https://social.msdn.microsoft.com/Forums/vstudio/en-US/c573db8b-c9cd-43d7-9f89-202ba9417296/fatal-error-c1091

  

改为使用STL。

     

代码段

     

#include <sstream>

     

std::ostringstream oss;

     

oss << myString1 << myString2 << myString3 << myString4;

     

oss.str()现在将返回STL的std :: string类的实例,而oss.str()。c_str()将返回一个const char *

答案 4 :(得分:-1)

你的问题可以被剥离到(在Python中):

whitelist_services = { ".NETFRAMEWORK", "_IOMEGA_ACTIVE_DISK_SERVICE_" }
if service in whitelist_services:
   print service, "is a whitelisted service"

直接翻译为C ++将是:

// g++ *.cc -std=c++0x && ./a.out
#include <iostream>
#include <unordered_set>

namespace {
  typedef const wchar_t* str_t;
  // or
  ////typedef std::wstring str_t;
  str_t servicesWhitelist[] = {
    L".NETFRAMEWORK",
    L"_IOMEGA_ACTIVE_DISK_SERVICE_",
  };
  const size_t N = sizeof(servicesWhitelist) / sizeof(*servicesWhitelist);

  // if you need to search for multiple services then a hash table
  // could speed searches up O(1). Otherwise std::find() on the array
  // might be sufficient O(N), or std::binary_search() on sorted array
  // O(log N) 
  const std::unordered_set<str_t> services
    (servicesWhitelist, servicesWhitelist + N);
}

int main() {
  str_t service = L".NETFRAMEWORK";
  if (services.find(service) != services.end())
    std::wcout << service << " is a whitelisted service" << std::endl;
}