2011-01-17 22 views
6

Esiste una libreria nativa in STL che è stata testata e funziona senza opzioni aggiuntive del compilatore? Ho cercato di usare <regex>, ma le uscite compilatore questo:Espressioni regolari in C++ STL

Nel inclusi file da /usr/include/c++/4.3/regex:40, da main.cpp: 5: /usr/include/c++/4.3 /c++0x_warning.h:36:2: error: #error Questo file richiede il supporto di compilatori e librerie per il prossimo standard ISO C++, C++ 0x. Questo supporto è attualmente sperimentale e deve essere abilitato con le opzioni del compilatore -std = C++ 0x o -std = gnu ++ 0x.

+5

Perché non si desidera aggiungere le opzioni alla riga di comando? –

risposta

11

G ++ 4.3 (e presumibilmente anche le versioni successive) sta solo facendo attenzione ai file di intestazione per la massima conformità degli standard.

Se si sta programmando in C++ 98 (lo standard corrente che è in uso da un po '), il supporto di espressioni regolari è stato aggiunto nel rapporto tecnico 1 e i file di intestazione e sono in una directory speciale tr1, e il contenuto è in uno spazio dei nomi speciale std::tr1.

Nel nuovo standard C++ 0x, il supporto per le espressioni regolari è stato unito alla libreria standard, quindi può essere trovato nell'intestazione regex e nello spazio dei nomi std.

G ++ si assicura di utilizzare la versione corretta per la versione --std= specificata nella riga di comando, anche se internamente sono entrambe la stessa implementazione.

Quindi, per rendere il lavoro regex senza passare a --std=c++0x, basta

#include <tr1/regex> 
+0

Bello, funziona (non emette avvisi o errori durante la compilazione), ma come dovrei scrivere il pattern stesso? modello regex ("[^ -] - [^ -]"); non funziona ... :(il compilatore dice "sconosciuto" type - regex –

+5

Questa è una domanda a parte, chiedile separatamente –

+0

fantastico! Posso usare C11! – Tebe

5

Sono abbastanza sicuro che il supporto per le espressioni regolari sia stato aggiunto in C++ 0x, quindi non ci sono elementi STL che lo supportano fino ad allora. Se non si desidera utilizzare C++ 0x, è possibile utilizzare invece Boost, ma non è in STL.

3

Si potrebbe provare a utilizzare Boost.Regex anziché le intestazioni di C++ 0x.
Anche lo STL non è la stessa cosa della libreria standard. Un tempo era la "Libreria dei modelli standard" quando era un'offerta di SGI. La libreria standard non ha adottato tutto ciò che riguarda l'STL (corda e slist) e copre molto più terreno rispetto a quanto fatto da STL (iostreams, tutte le intestazioni tr1, tr2 e C++ 0x).