2009-07-25 3 views
5

처음에는 Boost.Regex에 의존하는 휴대용 C++ 라이브러리 코드를 작성하려고합니다. 그리고 컴파일러가 지원하고 결국에는 C++로 TR1로 이동합니다. std :: tr1 네임 스페이스에서 std로 이동 한 후 0x 사양. 여기에 내가 전처리와는하고 싶은 것을 위해 일부 의사 코드 :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; 
} 

그 모든 처리기 지시문에있을 필요가, 부여,하지만 내가 수행하는 방법을 알고 있다면 그건 내가 않을 것 여기에서 물어보십시오. :)

답변

10

전에 전처리하기 전에 제 3의 물건에 의존하지 않고는 작업을 수행 할 수 없습니다. 일반적으로 autoconf 같은 것을 사용하여이를 수행 할 수 있습니다.

사용하려는 헤더/라이브러리가 있음을 나타내는 #define 지시어로 다른 헤더 파일을 생성하여 작동합니다.

+0

설명해 주셔서 감사합니다! :) – Zac

6

당신은 할 수 없습니다. C++의 전처리 단계는 컴파일 단계 전에 발생하므로 C++ 언어 조건부 구문을 #include와 같은 전 처리기 지시문에 유용하게 배치 할 수 없습니다.

조건부 컴파일이 필요한 경우 #ifdef를 사용하는 것이 좋습니다. 같은 뭔가 :

BOOST_BUILD 당신이 당신의 메이크이든에 정의 처리기의 상징이다
#ifdef BOOST_BUILD 
    #include "somebooststuff.h" 
    using namespace boost; 
#else 
    #include "somestdstuff.h" 
    using namespace std; 
#endif 

.

+0

을해야합니다 C의 버전을 볼 매크로 C++ 컴파일 된 조건부 구조를 사용하려하지 않습니다. 더 구체적으로, #ifdef 지시문과 비슷한 것을 찾고 있는데, include 파일이 있는지 확인하는 기능이 있습니다. #ifexists (또는 그와 비슷한 것) – Zac

+3

그런 전처리 기 기능이 없습니다. 이 작업을 정말로 수행해야하는 경우에는 필자가 의심 스럽다.) 컴파일하기 전에 Perl이나 Python과 같은 텍스트 처리 스크립트를 통해 코드를 실행해야한다. –

3

사용할 수있는 __cplusplus 당신이 다음 표준 (C++ 1 배, C++0x isn't meant to be)에서, 함께 작업하는 ++ 내가 특별히 내가 '년후 말했다는 a value larger than 199711L

#if __cplusplus > 199711 
    using std::regex; 
#else 
    using std::tr1::regex; 
#endif 
관련 문제