फ़ीचर डिटेक्शन
यह पता लगाने के लिए एक स्निपेट है कि 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 प्रमुख संस्करण है
परिक्षण
आप इसे जीसीसी के साथ इस तरह से परख सकते हैं:
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
खतरनाक इलाके
यह पूरी तरह से असमर्थ है और जीसीसी डेवलपर्स ने bits/regex*
हेडर में डाल दिया है कि निजी मैक्रो का पता लगाने पर निर्भर करता है । वे बदल सकते थे और कभी भी चले जा सकते थे । उम्मीद है, उन्हें वर्तमान 4.9.x, 5.x, 6.x रिलीज़ में नहीं हटाया जाएगा, लेकिन वे 7.x रिलीज़ में दूर जा सकते हैं।
यदि GCC डेवलपर्स ने #define _GLIBCXX_HAVE_WORKING_REGEX 1
7.x रिलीज़ में एक (या कुछ और, हिंट हिड नजेज) जोड़ा है, जो बरकरार है, तो इस स्निपेट को शामिल करने के लिए अपडेट किया जा सकता है और बाद में जीसीसी रिलीज़ स्निपेट के साथ काम करेगा।
जहाँ तक मुझे पता है, अन्य सभी संकलक एक काम <regex>
करते हैं, __cplusplus >= 201103L
लेकिन YMMV।
जाहिर है कि यह पूरी तरह से टूट जाएगा अगर किसी ने हेडर के बाहर _GLIBCXX_REGEX_DFS_QUANTIFIERS_LIMIT
या _GLIBCXX_REGEX_STATE_LIMIT
मैक्रोज़ को परिभाषित किया stdc++-v3
।
<regex>
समर्थन अधूरा है। हम आपकी क्या मदद कर सकते हैं?