기능 감지
이것은 libstdc++
구현이 C 전처리기로 구현 되었는지 감지하는 스 니펫입니다 .
#include <regex>
#if __cplusplus >= 201103L && \
(!defined(__GLIBCXX__) || (__cplusplus >= 201402L) || \
(defined(_GLIBCXX_REGEX_DFS_QUANTIFIERS_LIMIT) || \
defined(_GLIBCXX_REGEX_STATE_LIMIT) || \
(defined(_GLIBCXX_RELEASE) && \
_GLIBCXX_RELEASE > 4)))
#define HAVE_WORKING_REGEX 1
#else
#define HAVE_WORKING_REGEX 0
#endif
매크로
_GLIBCXX_REGEX_DFS_QUANTIFIERS_LIMIT
에 정의 되어 있습니다 bits/regex.tcc
.4.9.x
_GLIBCXX_REGEX_STATE_LIMIT
에 정의 되어 있습니다 bits/regex_automatron.h
.5+
_GLIBCXX_RELEASE
이 답변7+
의 결과 로 추가되었으며 GCC 주 버전입니다.
테스팅
다음과 같이 GCC로 테스트 할 수 있습니다.
cat << EOF | g++ --std=c++11 -x c++ - && ./a.out
#include <regex>
#if __cplusplus >= 201103L && \
(!defined(__GLIBCXX__) || (__cplusplus >= 201402L) || \
(defined(_GLIBCXX_REGEX_DFS_QUANTIFIERS_LIMIT) || \
defined(_GLIBCXX_REGEX_STATE_LIMIT) || \
(defined(_GLIBCXX_RELEASE) && \
_GLIBCXX_RELEASE > 4)))
#define HAVE_WORKING_REGEX 1
#else
#define HAVE_WORKING_REGEX 0
#endif
#include <iostream>
int main() {
const std::regex regex(".*");
const std::string string = "This should match!";
const auto result = std::regex_search(string, regex);
#if HAVE_WORKING_REGEX
std::cerr << "<regex> works, look: " << std::boolalpha << result << std::endl;
#else
std::cerr << "<regex> doesn't work, look: " << std::boolalpha << result << std::endl;
#endif
return result ? EXIT_SUCCESS : EXIT_FAILURE;
}
EOF
결과
다음은 다양한 컴파일러에 대한 몇 가지 결과입니다.
$ gcc --version
gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-11)
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
$ ./a.out
<regex> doesn't work, look: false
$ gcc --version
gcc (GCC) 6.2.1 20160830
Copyright (C) 2016 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
$ ./a.out
<regex> works, look: true
$ gcc --version
gcc (Debian 4.9.2-10) 4.9.2
Copyright (C) 2014 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
$ ./a.out
<regex> works, look: true
$ gcc --version
gcc (Ubuntu 6.2.0-5ubuntu12) 6.2.0 20161005
Copyright (C) 2016 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
$ ./a.out
<regex> works, look: true
$ gcc --version
gcc (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
$ ./a.out
<regex> works, look: true
$ gcc --version
gcc (GCC) 6.2.1 20160830
Copyright (C) 2016 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
$ clang --version
clang version 3.9.0 (tags/RELEASE_390/final)
Target: x86_64-unknown-linux-gnu
Thread model: posix
InstalledDir: /usr/bin
$ ./a.out # compiled with 'clang -lstdc++'
<regex> works, look: true
여기 드래곤이 있습니다
이것은 완전히 지원되지 않으며 GCC 개발자가 bits/regex*
헤더에 넣은 비공개 매크로 감지에 의존합니다 . 그들은 언제든지 변경되고 사라질 수 있습니다. 바라건대, 현재 4.9.x, 5.x, 6.x 릴리스에서는 제거되지 않지만 7.x 릴리스에서는 사라질 수 있습니다.
GCC 개발자 #define _GLIBCXX_HAVE_WORKING_REGEX 1
가 7.x 릴리스에 지속 되는 (또는 무언가, 힌트 힌트 넛지)를 추가했다면 ,이 코드 조각은이를 포함하도록 업데이트 될 수 있으며 이후 GCC 릴리스는 위의 코드 조각과 함께 작동합니다.
지금까지 내가 아는 한, 다른 컴파일러가 작동해야 하지만 YMMV을.<regex>
__cplusplus >= 201103L
누군가 헤더 외부 에서 _GLIBCXX_REGEX_DFS_QUANTIFIERS_LIMIT
또는 _GLIBCXX_REGEX_STATE_LIMIT
매크로를 정의하면 분명히 이것은 완전히 중단됩니다 stdc++-v3
.
<regex>
지원이 불완전합니다. 무엇을 도와 드릴까요?