Deteksi Fitur
Ini adalah potongan untuk mendeteksi jika libstdc++
implementasi diimplementasikan dengan C preprocessor mendefinisikan:
#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
Makro
_GLIBCXX_REGEX_DFS_QUANTIFIERS_LIMIT
adalah didefinisikan di bits/regex.tcc
dalam4.9.x
_GLIBCXX_REGEX_STATE_LIMIT
adalah didefinisikan di bits/regex_automatron.h
dalam5+
_GLIBCXX_RELEASE
ditambahkan ke 7+
sebagai hasil dari jawaban ini dan merupakan versi utama GCC
Menguji
Anda dapat mengujinya dengan GCC seperti ini:
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
Hasil
Berikut beberapa hasil untuk berbagai kompiler:
$ 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
Ini Naga
Ini sama sekali tidak didukung dan bergantung pada deteksi makro pribadi yang telah dimasukkan oleh pengembang GCC ke dalam bits/regex*
header. Mereka bisa berubah dan pergi kapan saja . Mudah-mudahan, mereka tidak akan dihapus di rilis 4.9.x, 5.x, 6.x saat ini tetapi mereka bisa hilang di rilis 7.x.
Jika pengembang GCC menambahkan #define _GLIBCXX_HAVE_WORKING_REGEX 1
(atau sesuatu, petunjuk petunjuk dorongan) dalam rilis 7.x yang bertahan, cuplikan ini dapat diperbarui untuk menyertakannya dan rilis GCC selanjutnya akan bekerja dengan cuplikan di atas.
Sejauh yang saya tahu, semua kompiler lainnya memiliki kerja <regex>
saat __cplusplus >= 201103L
tapi YMMV.
Jelas ini akan benar-benar rusak jika seseorang mendefinisikan _GLIBCXX_REGEX_DFS_QUANTIFIERS_LIMIT
atau _GLIBCXX_REGEX_STATE_LIMIT
makro di luar stdc++-v3
tajuk.
<regex>
dukungan libstdc ++ tidak lengkap. Apa yang bisa kami bantu?