문제
내가 쓴 Ruby C++확장 을 포장 구글의 re2 정규 표현식 라이브러리 하지만 최근 업데이트 라이브러리 변경의 인터페이스 Match()
기능:
bool Match(const StringPiece& text,
int startpos,
Anchor anchor,
StringPiece *match,
int nmatch) const;
하기:
bool Match(const StringPiece& text,
int startpos,
int endpos,
Anchor anchor,
StringPiece *match,
int nmatch) const;
(참고 새로운 int endpos
니다.)
나의 질문은:그것은 나를 모두 지원하는 버전에서 이 라이브러리 하나의 확장자는 사실에도 불구하고 re2 하지 않는 것을 지정하는 어떠한 종류의 VERSION
정할 수 있는 성찰?
이상적으로,내가 원하는 시도 할 수있는 새 버전(을 가진 6 인수)그리고,실패하는 가을,돌아가 이전 버전(으로 나는 할 수 있의 백필 endpos
인수를 쉽게).
순간에 내 코드는 다음과 같습니다:
matched = p->pattern->Match(text_as_string_piece, 0, (int)RSTRING_LEN(text), RE2::UNANCHORED, 0, 0);
그러나 만약 당신이 이전 버전의 re2,그것이 필요하다:
matched = p->pattern->Match(text_as_string_piece, 0, RE2::UNANCHORED, 0, 0);
해결책
전통적인 응답을 생성하는 것입 config.h
또는 어떤 설치 시.
즉,설치 위치를 감지는 버전 re2
를 설치한 다음,정의 상징에서 config.h
이에 따라:
// config.h
#ifndef CONFIG_H_INCLUDED
#define CONFIG_H_INCLUDED
#define RE2_MATCH_6_ARGS 1
#endif // CONFIG_H_INCLUDED
그리고,이 사용할 수 있습니다:
#if defined(RE2_MATCH_6_ARGS) && RE2_MATCH_6_ARGS == 1
matched = p->pattern->Match(text_as_string_piece, 0, (int)RSTRING_LEN(text), RE2::UNANCHORED, 0, 0);
#else
matched = p->pattern->Match(text_as_string_piece, 0, RE2::UNANCHORED, 0, 0);
#endif
이것은 안정적인 솔루션과 작업해야 합니다.
다른 기능을 시스템을 해킹...
제공하의 정의를 모두 Match
기능에 있는 래퍼 라이브러리:
Match5
오류가 발생(주시기 바랍에 대한 링크를 re2)Match6
앞으로Match5
.
는 것입니다(유닉스 세계에서...),경우에는 기호는 이미 로드,덮어쓰지 않습니다하여 새로운 정의합니다.그래서 한 re2
드 첫 번째 결국 하나에서 그의 두 가지 시나리오:
- 오
re2
:귀하의(래퍼)라이브러리 제공하의 정의Match6
이는 앞으로re2
제공하는 정의Match5
- 뉴
re2
:호출이 직접 간다의 정의Match6
그re2
제공하는
많 더 많은 과민하게 됩니다.이 필요합 래퍼 라이브러리 주변 re2
.가능성하는 작업으로 정적 링크(지 못했지만...).하지만 필요하지 않습 ./configure
단계입니다.
다른 팁
내가 아는 것에서, 당신은 할 수 없습니다.이렇게하면 네임 스페이스가 충돌 할 수있는 이전 버전과 새 버전의 RE2와 링크를해야합니다.
이전 버전을 잃어 버리는이 메소드의 버전이 없으면 새 버전이 붙어 있습니다.
두 버전 모두에 대해 컴파일 컴파일 컴파일 할 수 있으려면 컨트롤을 제어하는 일부 플래그를 정의하는 컴파일 단계를 수정해야합니다.
.
#ifdef RE2_ODLFORMAT
matched = p->pattern->Match(text_as_string_piece, 0, RE2::UNANCHORED, 0, 0);
#else
matched = p->pattern->Match(text_as_string_piece, 0, (int)RSTRING_LEN(text), RE2::UNANCHORED, 0, 0);
#endif
코드를 컴파일하려면 해당 줄을 따라 뭔가를 할 수 있습니다.
.make RE2_OLDFORMAT=1 all # compile for old version
make all # default target is for new version