Phát hiện tính năng
Đây là đoạn mã để phát hiện xem việc libstdc++
triển khai có được triển khai với C tiền xử lý xác định:
#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
Macro
_GLIBCXX_REGEX_DFS_QUANTIFIERS_LIMIT
được định nghĩa trong bits/regex.tcc
trong4.9.x
_GLIBCXX_REGEX_STATE_LIMIT
được định nghĩa trong bits/regex_automatron.h
trong5+
_GLIBCXX_RELEASE
đã được thêm vào 7+
do câu trả lời này và là phiên bản chính của GCC
Thử nghiệm
Bạn có thể kiểm tra nó với GCC như sau:
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
Các kết quả
Dưới đây là một số kết quả cho các trình biên dịch khác nhau:
$ 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
Đây là những con rồng
Điều này hoàn toàn không được hỗ trợ và dựa vào việc phát hiện các macro riêng mà các nhà phát triển GCC đã đưa vào bits/regex*
tiêu đề. Họ có thể thay đổi và biến mất bất cứ lúc nào . Hy vọng rằng chúng sẽ không bị xóa trong các bản phát hành 4.9.x, 5.x, 6.x hiện tại nhưng chúng có thể biến mất trong các bản phát hành 7.x.
Nếu các nhà phát triển GCC đã thêm một #define _GLIBCXX_HAVE_WORKING_REGEX 1
(hoặc một cái gì đó, gợi ý gợi ý về cách di chuyển) trong bản phát hành 7.x vẫn tồn tại, thì đoạn mã này có thể được cập nhật để bao gồm đoạn mã đó và các bản phát hành GCC sau này sẽ hoạt động với đoạn mã trên.
Theo như tôi biết, tất cả các trình biên dịch khác đều hoạt động <regex>
khi __cplusplus >= 201103L
ngoại trừ YMMV.
Rõ ràng là điều này sẽ hoàn toàn bị phá vỡ nếu ai đó định nghĩa _GLIBCXX_REGEX_DFS_QUANTIFIERS_LIMIT
hoặc _GLIBCXX_REGEX_STATE_LIMIT
macro bên ngoài stdc++-v3
tiêu đề.
<regex>
hỗ trợ của libstdc ++ chưa hoàn thành. Chúng tôi có thể giúp gì cho bạn?