2011-11-02 27 views
12

Khi lập trình trong C++ STL, hoặc sử dụng 'templatization' một cách mạnh mẽ, và một số lỗi biên dịch xảy ra, thường báo cáo lỗi thực sự dài, và thông thường không cần nhiều thông tin. Tôi đang nói về gcc, tôi không biết nếu với trình biên dịch khác là khác nhau, nhưng một số lần ngay cả đối với chỉ một lỗi đánh máy, phải mất một thời gian để bắt lỗi tẩy cácLàm cách nào để xử lý báo cáo lỗi mẫu STL quá dài?

<ns::type<ns::type<ns::type, ns::type<...><ns::type<...> > > > > 

Tôi đang tìm cho một số trình biên dịch cờ, lừa, cách giải quyết hoặc phương pháp luận (tôi hiện đang sao chép quá khứ lỗi và đặt trên hai dòng những gì tôi có và trình biên dịch sử dụng để muốn và loại bỏ các biến đánh dấu ... (kinda buồn thủ tục cho một không-để-uncommon ctrl + s không được thực hiện tốt)) có thể làm cho tác vụ này nhanh hơn hoặc chỉ giúp tôi (thậm chí chỉ một số cú pháp lỗi cú pháp IDE nổi bật ...)

+4

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. –

+0

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

Trả lời

11

STLFilt: An STL Error Message Decryptor for C++ là một công cụ phổ biến để lọc các thông báo lỗi dài dòng này chúng thành một thứ dễ đọc hơn.

Từ trang web của họ:

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 đó.

Dưới đây là a demo run cho thấy làm thế nào nó có thể hữu ích:

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ã.]

Nhược điểm duy nhất tôi có thể thấy là nó mislabels các Thư viện chuẩn C++. :(

Dưới đây là a relevant journal article bởi tác giả STLFilt của

+1

Trong khi điều này về lý thuyết có thể trả lời câu hỏi, [nó sẽ là thích hợp hơn] (http://meta.stackexchange.com/q/8259) để bao gồm các phần thiết yếu của câu trả lời ở đây, và cung cấp liên kết để tham khảo. – Kev

+0

@Kev: Có lẽ, tuy nhiên, các downvotes nên được dành riêng cho thông tin không chính xác, không phải là thông tin "không được trình bày". EDIT: Ngoài ra, tương tự thậm chí không giữ cho này Q & A đặc biệt. – GManNickG

+1

@GMan - Tôi thậm chí không thấy phiếu bầu được lan truyền khi tôi xem lại lá cờ. Tuy nhiên, câu trả lời chỉ là một liên kết không được khuyến khích, chúng tôi muốn thấy chúng được sao lưu với một bản tóm tắt về những gì người dùng có thể mong đợi để xem ở đầu bên kia. Nó cũng cho biết thêm grist cho công cụ tìm kiếm kết quả. – Kev

4

Một vài người đã thực hiện các công cụ để thực hiện điều này, như không có gì inbuilt tấn là trên Google, nhưng lợi nhuận kết quả hàng đầu:.. http://www.bdsoft.com/tools/stlfilt.html

Nó phải tương thích với visual studio và gcc.

chỉnh sửa ::

tôi cần phải gõ ít để thực sự có được đầu vào trong thời gian :)

Các vấn đề liên quan