如何在 C++ 中包含极长的文字来源?
我有一点问题。本质上,我需要在我的程序中存储大量白名单条目,并且我想直接包含这样一个列表——我不想分发其他库等,我也不想将字符串嵌入到 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
I've got a bit of a problem. Essentially, I need to store a large list of whitelisted entries inside my program, and I'd like to include such a list directly -- I don't want to have to distribute other libraries and such, and I don't want to embed the strings into a Win32 resource, for a bunch of reasons I don't want to go into right now.
I simply included my big whitelist in my .cpp file, and was presented with this error:
1>ServicesWhitelist.cpp(2807): fatal error C1091: compiler limit: string exceeds 65535 bytes in length
The string itself is about twice this allowed limit by VC++. What's the best way to include such a large literal in a program?
EDIT:
I'm storing the string like this:
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
It's used at runtime in a way similar to this:
static const boost::wregex servicesWhitelistRegex(servicesWhitelist);
std::wstring service;
//code to populate service
if (!boost::regex_match(service, servicesWhitelistRegex))
//Do something to print service
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
数组怎么样? (您只需将逗号放在每个元素的合法限制之后)
您可以使用以下语句来获取组合字符串。
How about an array? (you would put the commas only after the legal limit for every element)
You could use the below statement to get the combined string.
假设您实际上需要存储一个大于 64k 个字符的字符串(即上述所有“只是不要这样做”的解决方案都不适用。)
为了让 MSVC 满意,而不是说:
您可以转换您的大于 64k 个字符字符串到表示为整数的单个字符:
其中每个字母都已转换为其等效的 ascii(97 == 'a' 等),并且在末尾添加了 NUL 终止符。
至少MSVC2010对此感到满意。
Let's assume you actually need to store a string >64k characters (i.e. all of the above "just don't do that" solutions don't apply.)
To make MSVC happy, instead of saying:
You can convert your >64k character string to individual characters represented as integers:
Where each letter has been converted to its ascii equivalent (97 == 'a', etc.), and a NUL terminator has been added at the end.
MSVC2010 at least is happy with this.
如果它只是限制的两倍左右,那么显而易见的解决方案似乎是存储 2 个(或 3 个)这样的字符串。 :) 我确信您在运行时读取它们的代码可以很容易地处理这个问题。
编辑:出于某种原因您需要使用正则表达式吗?您能否将大字符串分解为单个标记的列表并进行简单的字符串比较?
If it's only about twice the limit the obvious solution would seem to be to store 2 (or 3) such strings. :) I'm sure your code that reads them at runtime can deal with that easily enough.
EDIT: Do you need to use a regex for some reason? Could you break up the big strings into a list of individual tokens and do a simple string comparison?
我对这个没有任何功劳:
https://social.msdn.microsoft.com/Forums/vstudio/en-US/c573db8b-c9cd-43d7-9f89-202ba9417296/fatal-error-c1091
I claim no credit for this one:
https://social.msdn.microsoft.com/Forums/vstudio/en-US/c573db8b-c9cd-43d7-9f89-202ba9417296/fatal-error-c1091
您的问题可以简化为(在 Python 中):
直接翻译为 C++ 将是:
You problem could be stripped down to (in Python):
A direct translation to C++ would be: