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

Bil*_*eal 5 c++ literals long-integer

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

我只是在我的.cpp文件中包含了我的大白名单,并且出现了这个错误:

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

字符串本身大约是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
);
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

Sam*_*eer 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|",
...
};
Run Code Online (Sandbox Code Playgroud)

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

accumulate(servicesWhitelist, servicesWhitelist+sizeof(servicesWhitelist)/sizeof(servicesWhitelist[0]), "")
Run Code Online (Sandbox Code Playgroud)


小智 6

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

为了让MSVC高兴,而不是说:

const char *foo = "abcd...";
Run Code Online (Sandbox Code Playgroud)

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

const char foo[] = { 97, 98, 99, 100, ..., 0 };
Run Code Online (Sandbox Code Playgroud)

其中每个字母都已转换为其等效的 ascii(97 == 'a' 等),并且在末尾添加了 NUL 终止符。

至少MSVC2010对此感到满意。