2009-07-25 10 views
5

Estoy intentando escribir algún código portátil de biblioteca C++ que inicialmente se basará en Boost.Regex, y luego pasará a TR1 a medida que los compiladores lo soporten, y finalmente a C++ Especificación 0x después de que las cosas se trasladan del espacio de nombres std :: tr1 a std. Aquí es un poco de pseudo-código para lo que me gustaría hacer con el preprocesador:Determine la existencia en tiempo de compilación de los archivos de inclusión en C++

if(exists(regex)) // check if I can #include <regex> 
{ 
    #include <regex> // per TR1 
    if(is_namespace(std::tr1)) // are we on TR1 or C++0x? 
    { 
     using std::tr1::regex; 
    } else 
    { 
     using std::regex; 
    } 
} else // fall-back to boost 
{ 
    #include <boost/regex.hpp> 
    using boost::regex; 
} 

Por supuesto, todo esto tendría que ser en las directivas de preprocesador, pero si sabía cómo lograr que no lo haría estar preguntando aquí. :)

Respuesta

10

No puede hacerlo sin depender de un tercero antes del preprocesamiento de. Generalmente, cosas como autoconf se pueden usar para lograr esto.

Funcionan generando otro archivo de encabezado con #define directivas que indican la existencia de encabezados/bibliotecas que desea utilizar.

+0

¡Gracias por la aclaración! :) – Zac

6

No puede hacerlo. La fase de preprocesamiento de C++ ocurre antes de la fase de compilación, por lo que las construcciones condicionales del lenguaje C++ no se pueden ubicar de manera útil alrededor de las directivas del preprocesador como #include.

Si necesita una compilación condicional, entonces la forma de hacerlo es usar #ifdef. Algo así como:

#ifdef BOOST_BUILD 
    #include "somebooststuff.h" 
    using namespace boost; 
#else 
    #include "somestdstuff.h" 
    using namespace std; 
#endif 

donde BOOST_BUILD es un símbolo de preprocesador se define en su makefile o lo que sea.

+0

me dijo específicamente que no estaba' Estoy tratando de usar construcciones condicionales compiladas en C++. Más específicamente, estoy buscando algo similar a una directiva #ifdef que tiene la funcionalidad de verificar si existe el archivo de inclusión: #ifexists (o algo por el estilo) – Zac

+3

No existe tal funcionalidad de preprocesador. Si realmente necesita hacer esto 9 y dudo que lo haga) necesita ejecutar su código a través de algún tipo de script de procesamiento de texto escrito en algo como perl o python antes de compilarlo. –

Cuestiones relacionadas