문제

내가 쓴 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:호출이 직접 간다의 정의 Match6re2 제공하는

더 많은 과민하게 됩니다.이 필요합 래퍼 라이브러리 주변 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
.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top