2010-03-20 2 views
5

У меня проблема. По сути, мне нужно сохранить большой список белых списков внутри моей программы, и я хотел бы включить такой список напрямую - я не хочу распространять другие библиотеки и т. Д., И я не хочу вставляйте строки в ресурс Win32, по целому ряду причин, которые я не хочу сейчас делать.Как включить слишком длинные литералы в источник C++?

Я просто включен мой большой белый список в моем файле .cpp, и был представлен с этой ошибкой:

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

Сама строка примерно в два раза это максимально допустимый уровень на VC++. Каков наилучший способ включить такой большой литерал в программу?

EDIT:

Я хранить строку, как это:

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 
+0

Как вы хранить строку? Например, он анализируется и хранится в наборе? – GManNickG

+0

@GMan: см. Вопрос edit –

+0

Есть ли какая-то причина, что он должен храниться именно в таком формате? Мне кажется, что его лучше хранить в «списке» или «что-то». – greyfade

ответ

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]), "") 
2

Если это примерно в два раза больше предела, очевидное решение, похоже, будет стоить re 2 (или 3) таких строк. :) Я уверен, что ваш код, который читает их во время выполнения, может справиться с этим достаточно легко.

EDIT: Нужно ли использовать регулярное выражение по какой-либо причине? Не могли бы вы разбить большие строки в список отдельных токенов и сделать простое сравнение строк?

-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; 
} 
+0

1. Это хорошо для Python, но Python не является моим целевым языком. Извините. 2. Кажется, это копия ответа Sameer ... –

+0

@Billy ONeal: 1. Я использовал Python в качестве псевдокода (в качестве краткой иллюстрации, которая показывает, что вам не нужны регулярные выражения для решения вашей проблемы). 2. Суть ответа заключается в том, чтобы отбросить регулярное выражение и использовать его показанных подходов. Ответ Sameer находится в корне регулярного выражения. – jfs

+0

, пожалуйста, прочитайте тег вопроса «C++» – Alrehamy

3

Давайте предположим, что вы на самом деле нужно хранить строку > 64 тыс. Символов (т. Е. Все вышеперечисленные «просто не делают» решения не применяются.)

Чтобы сделать MSV С счастливым, вместо того чтобы сказать:

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

Вы можете конвертировать> 64k строку вашего персонажа к отдельным символам, представленных в виде целых чисел:

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

Где каждая буква была преобразована в его эквивалент ASCII (97 == 'a' и т. д.), а в конце добавлен терминатор NUL.

MSVC2010 по крайней мере доволен этим.

+0

или const wchar_t foo [] в этом случае. – rxantos

Смежные вопросы