2011-01-17 23 views
6

¿Hay alguna biblioteca nativa en STL que se pruebe y funciona sin opciones de compilador adicionales? He intentado utilizar <regex>, pero las salidas del compilador esto:Expresiones regulares en C++ STL

En el archivo incluído en /usr/include/c++/4.3/regex:40, desde main.cpp: 5: /usr/include/c++/4.3 /c++x_warning.h:36:2: error: #error Este archivo requiere compatibilidad con el compilador y la biblioteca para el próximo estándar ISO C++, C++ 0x. Este soporte actualmente es experimental y debe habilitarse con las opciones del compilador -std = C++ 0x o -std = gnu ++ 0x.

+5

¿Por qué no quiere añadir opciones para la línea de comandos? –

Respuesta

11

G ++ 4.3 (y presumiblemente en versiones posteriores también) es solo tener cuidado con los archivos de cabecera para una máxima conformidad con los estándares.

Si está programando en C++ 98 (el estándar actual que ha existido por un tiempo), entonces se agregó el soporte de expresiones regulares en el informe técnico 1, y los archivos de encabezado están en un directorio especial tr1, y los contenidos están en un espacio de nombre especial std::tr1.

En el nuevo estándar C++ 0x, el soporte de expresiones regulares se ha fusionado en la biblioteca estándar, por lo que se puede encontrar en el encabezado regex y el espacio de nombres std.

G ++ se asegura de que utiliza la versión correcta para la versión --std= que especificó en la línea de comandos, aunque internamente ambas son la misma implementación.

Así que para hacer el trabajo de expresiones regulares sin cambiar a --std=c++0x, simplemente

#include <tr1/regex> 
+0

Agradable, esto funciona (no genera advertencias o errores al compilar), pero ¿cómo debo escribir el patrón? patrón regex ("[^ -] - [^ -]"); no está funcionando ... :(el compilador dice "desconocido" tipo - regex –

+5

Esa es una pregunta separada. Pídala por separado. –

+0

¡Fantástico! ¡Puedo usar C11! – Tebe

5

Estoy bastante seguro de que la compatibilidad con expresiones regulares se agregó en C++ 0x, por lo que no hay elementos de STL que lo admitan hasta entonces. Si no quiere usar C++ 0x, podría usar Boost en su lugar, pero eso no está en el STL.

3

Puede intentar usar Boost.Regex en lugar de los encabezados C++ 0x.
También el STL no es lo mismo que la biblioteca estándar. Solía ​​significar "Biblioteca de plantillas estándar" cuando era una oferta de SGI. La biblioteca estándar no adoptó todo en el STL (cuerda y deslizamiento) y cubre mucho más terreno que el STL (iostream, todos los encabezados tr1, tr2 y C++ 0x).

Cuestiones relacionadas