STLFilt ban đầu đã được hình thành như một trợ giảng dạy, cho phép sinh viên dùng C++ và/hoặc nhà xưởng STL-cụ thể để làm cho cảm giác thường thông báo lỗi STL overbloated. Hôm nay, tuy nhiên, ngay cả một số chuyên gia C++ đã thông qua STLFilt để sử dụng trong phát triển hàng ngày. Kết quả có thể không phải lúc nào cũng hoàn hảo, nhưng phần lớn thời gian thông tin bị mất trong khi Giải mã không quan trọng đối với ứng dụng đang được gỡ lỗi. Phần còn lại của thời gian, Giải mã đủ dễ dàng để bỏ qua.
Phân phối cho mỗi nền tảng (bộ biên dịch/thư viện) là khép kín và được điều chỉnh theo tính đồng nhất của nền tảng đó. Mỗi Kịch bản Perl thực hiện thay thế regex cơ bản cho tất cả các tiêu chuẩn (và mở rộng, nếu có trong thư viện) thành phần STL, trong khi các phiên bản nhất định của tập lệnh đi xa hơn đối với thông báo đặt hàng, gói dòng, xử lý lỗi tiêu đề thư viện, vv, như tôi đơn phương được coi là thích hợp cho nền tảng đó.
Chương trình nguồn:
#include <map>
#include <algorithm>
#include <cmath>
const int values[] = { 1,2,3,4,5 };
const int NVALS = sizeof values/sizeof (int);
int main()
{
using namespace std;
typedef map<int, double> valmap;
valmap m;
for (int i = 0; i < NVALS; i++)
m.insert(make_pair(values[i], pow(values[i], .5)));
valmap::iterator it = 100; // error
valmap::iterator it2(100); // error
m.insert(1,2); // error
return 0;
}
Thứ nhất, một chạy không lọc bằng cách sử dụng gcc MinGW 3.2 trình biên dịch:
d:\src\cl\demo>c++2 rtmap.cpp
rtmap.cpp: In function `int main()':
rtmap.cpp:19: invalid conversion from `int' to `
std::_Rb_tree_node<std::pair<const int, double> >*'
rtmap.cpp:19: initializing argument 1 of `std::_Rb_tree_iterator<_Val, _Ref,
_Ptr>::_Rb_tree_iterator(std::_Rb_tree_node<_Val>*) [with _Val =
std::pair<const int, double>, _Ref = std::pair<const int, double>&, _Ptr =
std::pair<const int, double>*]'
rtmap.cpp:20: invalid conversion from `int' to `
std::_Rb_tree_node<std::pair<const int, double> >*'
rtmap.cpp:20: initializing argument 1 of `std::_Rb_tree_iterator<_Val, _Ref,
_Ptr>::_Rb_tree_iterator(std::_Rb_tree_node<_Val>*) [with _Val =
std::pair<const int, double>, _Ref = std::pair<const int, double>&, _Ptr =
std::pair<const int, double>*]'
E:/GCC3/include/c++/3.2/bits/stl_tree.h: In member function `void
std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::insert_unique(_II,
_II) [with _InputIterator = int, _Key = int, _Val = std::pair<const int,
double>, _KeyOfValue = std::_Select1st<std::pair<const int, double> >,
_Compare = std::less<int>, _Alloc = std::allocator<std::pair<const int,
double> >]':
E:/GCC3/include/c++/3.2/bits/stl_map.h:272: instantiated from `void std::map<_
Key, _Tp, _Compare, _Alloc>::insert(_InputIterator, _InputIterator) [with _Input
Iterator = int, _Key = int, _Tp = double, _Compare = std::less<int>, _Alloc = st
d::allocator<std::pair<const int, double> >]'
rtmap.cpp:21: instantiated from here
E:/GCC3/include/c++/3.2/bits/stl_tree.h:1161: invalid type argument of `unary *
'
Và chạy được lọc bằng Proxy C++ cụ thể gcc:
d:\src\cl\demo>c++ rtmap.cpp
*** {BD Software Proxy c++ for gcc v3.01} STL Message Decryption is ON! ***
rtmap.cpp: In function `int main()':
rtmap.cpp:19: invalid conversion from `int' to `iter'
rtmap.cpp:19: initializing argument 1 of `iter(iter)'
rtmap.cpp:20: invalid conversion from `int' to `iter'
rtmap.cpp:20: initializing argument 1 of `iter(iter)'
stl_tree.h: In member function `void map<int,double>::insert_unique(_II, _II)':
[STL Decryptor: Suppressed 1 more STL standard header message]
rtmap.cpp:21: instantiated from here
stl_tree.h:1161: invalid type argument of `unary *'
STL Decryptor reminder:
Use the /hdr:L option to see all suppressed standard lib headers
[Chú ý: bản demo chạy được thực hiện trong một giao diện điều khiển cửa sổ 80 cột với dòng gói thông minh STLFilt của kích hoạt, và với nội tắc thiết lập để tạo ra các thông điệp như ngắn gọn càng tốt. Chi tiết hơn là có sẵn bằng cách điều chỉnh các tùy chọn của Bộ giải mã.]
Biên dịch với trình biên dịch khác thường rất, rất hữu ích. gcc, Visual C++, trình biên dịch dựa trên EDG (như Comeau hoặc Intel C++), và Clang tất cả sản xuất các thông báo chẩn đoán rất khác nhau cho các lỗi biên dịch mẫu. Tất cả chúng đều có một số thông điệp chẩn đoán rất hữu ích và tất cả chúng đều có một số thông tin hoàn toàn vô dụng. Nếu bạn biên dịch với nhiều hơn một trình biên dịch, có nhiều khả năng bạn sẽ nhận được một thông báo chẩn đoán hữu ích hơn. –
uhm, tôi sẽ thử. Tôi nghĩ chúng khá chuẩn, tuy nhiên nó không thoải mái lắm. – jalone