การตรวจจับคุณสมบัติ
นี่คือตัวอย่างข้อมูลเพื่อตรวจสอบว่า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 ในภายหลังจะใช้ได้กับข้อมูลโค้ดด้านบน
เท่าที่ฉันรู้คอมไพเลอร์อื่น ๆ ทั้งหมดมีการทำงาน<regex>
เมื่อ__cplusplus >= 201103L
แต่ YMMV
เห็นได้ชัดว่าสิ่งนี้จะพังอย่างสมบูรณ์หากมีคนกำหนด_GLIBCXX_REGEX_DFS_QUANTIFIERS_LIMIT
หรือ_GLIBCXX_REGEX_STATE_LIMIT
มาโครนอกstdc++-v3
ส่วนหัว
<regex>
การสนับสนุนของ libstdc ++ ไม่สมบูรณ์ เราช่วยอะไรคุณได้บ้าง?