2011-01-17 14 views
6

Gibt es eine native Bibliothek in STL, die getestet wurde und ohne zusätzliche Compileroptionen auskommt? Ich versuchte <regex> zu verwenden, aber der Compiler gibt diese:Reguläre Ausdrücke in C++ STL

In-Datei enthalten von /usr/include/c++/4.3/regex:40, von main.cpp: 5: /usr/include/c++/4.3 /c++0x_warning.h:36:2: error: #fehler Diese Datei erfordert Compiler- und Bibliotheksunterstützung für den kommenden ISO C++ - Standard C++ 0x. Diese Unterstützung ist derzeit experimentell und muss mit den Compileroptionen -std = C++ 0x oder -std = gnu ++ 0x aktiviert werden.

+5

Warum wollen Sie keine Optionen in der Befehlszeile hinzufügen? –

Antwort

11

G ++ 4.3 (und vermutlich auch spätere Versionen) ist nur vorsichtig mit den Header-Dateien für maximale Konformität der Standards.

Wenn Sie in C++ 98 programmieren (der aktuelle Standard, der schon eine Weile existiert), dann wurde die Unterstützung für reguläre Ausdrücke in Tech Report 1 hinzugefügt, und die Headerdateien befinden sich in einem speziellen Verzeichnis tr1. und der Inhalt befindet sich in einem speziellen Namensraum std::tr1.

Im neuen C++ 0x-Standard wurde die Unterstützung für reguläre Ausdrücke in die Standardbibliothek integriert, sodass sie in der Kopfzeile regex und im Namespace std zu finden ist.

G ++ stellt sicher, dass Sie die richtige Version für die --std= Version verwenden, die Sie in der Befehlszeile angegeben haben, obwohl intern beide dieselbe Implementierung sind.

So regex Arbeit zu machen, ohne zu --std=c++0x Umschalten nur

#include <tr1/regex> 
+0

Schön, das funktioniert (es gibt keine Warnungen oder Fehler beim Kompilieren), aber wie soll ich das Muster selbst schreiben? Regex-Muster ("[^ -] - [^ -]"); funktioniert nicht ... :(Compiler sagt "unknown" type - regex –

+5

Das ist eine separate Frage.Fragen Sie es separat –

+0

fantastisch! Ich kann C11 verwenden! – Tebe

5

Ich bin mir ziemlich sicher, dass die Unterstützung für reguläre Ausdrücke in C++ 0x hinzugefügt wurde, also gibt es bis dahin keine STL-Dinge, die dies unterstützen. Wenn Sie nicht C++ 0x verwenden möchten, könnten Sie stattdessen Boost verwenden, aber das ist nicht in der STL.

3

Sie könnten Boost.Regex anstelle der C++ 0x-Header verwenden.
Auch die STL ist nicht das Gleiche wie die Standardbibliothek. Früher stand es für "Standard Template Library", damals war es ein Angebot von SGI. Die Standard-Bibliothek hat nicht alles in der STL übernommen (Seil und Slist) und deckt viel mehr Boden ab als die STL (iostreams, alle Tr1-, Tr2- und C++ 0x-Header).