Wie füge ich extrem lange Literale in C++ - Quellcode?
Ich habe ein bisschen ein problem. Im wesentlichen brauche ich zum speichern einer großen Liste von Whitelist-Einträgen in meinem Programm, und ich würde gerne eine solche Liste direkt -- ich will nicht zu haben, Sie zu verteilen, andere Bibliotheken und so, und ich will nicht zum einbetten des strings in eine Win32-Ressource, für eine Reihe von Gründen, die ich nicht wollen, zu gehen in jetzt.
Ich einfach meine große whitelist in meinem .cpp-Datei, und vorgestellt wurde mit diesem Fehler:
1>ServicesWhitelist.cpp(2807): fatal error C1091: compiler limit: string exceeds 65535 bytes in length
Den string selbst ist etwa das doppelte der erlaubten Grenze von VC++. Was ist der beste Weg, um solche großen Literale in einem Programm?
EDIT:
Ich bin die Speicherung der Zeichenfolge wie diese:
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
Es ist zur Laufzeit verwendet, in einer Weise ähnlich zu diesem:
static const boost::wregex servicesWhitelistRegex(servicesWhitelist);
std::wstring service;
//code to populate service
if (!boost::regex_match(service, servicesWhitelistRegex))
//Do something to print service
- Wie speichern Sie die Zeichenfolge? Wie wird es analysiert und gespeichert in einer Reihe?
- Siehe Frage Bearbeiten
- Gibt es irgendein Grund, dass es gespeichert werden müssen, in genau diesem format? Es sieht für mich aus wie könnte es besser werden, gespeichert in einem
list<>
oder so etwas. - Wie sehen Sie die bis-Werte in dieser Zeichenkette, meine ich. Auf die run-Zeit, haben Sie analysiert?
- Wieder bearbeitet. Auch ein C-W.
- Der Grund, warum ich nicht (momentan) haben, dass ist dann habe ich den overhead von drei Unmenge Anrufe zu mycontainer::push_back, die macht die binäre riesige.
- warum würden Sie machen es CW?
- Oh, good grief! Sie sind über das ganze massive Zeichenfolge als einzelnes regex? Das muss alptraumhaft langsam. Ich würde schauen für ein einfacher Algorithmus, ehrlich. Erstellen Sie einen trie aus Ihrer whitelist und match
service
gegen Sie, zum Beispiel. - Es ist ähnlich in der Geschwindigkeit, um die hash-Tabelle Umsetzung landete ich mit. Die Bauzeit war länger, aber nicht wirklich wichtig in dieser Anwendung. In vielen Möglichkeiten, die der regex war schneller als der hash-Tabelle für mehr Leistungen, die nicht in der whitelist, weil der finite-state-Maschine wäre schneller scheitern.
- Myers: es ist CW, weil ich stumm war, und ein Häkchen in der box 🙁
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wie über ein array? (setzen Sie die Kommas nur nach den gesetzlichen Grenzwert für jedes element)
Können Sie mit der nachstehenden Anweisung bekommen Sie die kombinierte Zeichenfolge.
Nehmen wir an, Sie wirklich brauchen, zu speichern eine Zeichenfolge >64k Zeichen (d.h. sämtliche oben "einfach nicht, dass" Lösungen nicht anwenden.)
Machen MSVC glücklich, anstatt zu sagen:
Können Sie konvertieren Sie Ihre >64k Zeichenkette einzelne Zeichen dargestellt als Ganzzahlen:
Wo jeder Buchstabe hat, wurde in Ihr ascii-äquivalent (97 == 'a' usw.), und ein NUL-terminator wurde am Ende Hinzugefügt.
MSVC2010 zumindest ist zufrieden mit diesem.
Wenn es nur über zweimal die Grenze, die offensichtliche Lösung zu sein scheint, die zum speichern von 2 (oder 3) diese Saiten. 🙂 Ich bin mir sicher, dein code liest, dass Sie zur Laufzeit behandeln kann, die leicht genug.
EDIT: Sie brauchen, um einen regex verwenden, aus irgendeinem Grund? Könnten Sie brechen die großen strings in eine Liste von einzelnen Token und einen einfachen string-Vergleich?
Habe ich Anspruch auf keinen Kredit für diese:
https://social.msdn.microsoft.com/Forums/vstudio/en-US/c573db8b-c9cd-43d7-9f89-202ba9417296/fatal-error-c1091
Problem könnte werden abgespeckte (in Python):
Eine direkte übersetzung in C++ wäre: