2012-03-05 64 views
7

Làm thế nào để tắt đánh dấu lỗi (sóng đỏ bên dưới mã) cho các toán tử dựa trên phạm vi C++ 11 như thế?QT Creator, kiểm tra cú pháp cho C++ 11

int myint[] = {1,2,3,4,5}; 
for (auto x : myint){/**/} 

Lời nhắc di chuột hiển thị "mã thông báo không mong muốn :". Mã biên dịch hoàn hảo.

Một vấn đề khác - tự động hoàn tất không hiển thị unique_ptr trong không gian tên std::, mặc dù biên dịch OK.

  • Qt Creator 2.4.0 Dựa trên Qt 4.7.4 (32 bit) Được xây dựng trên 12 Tháng 12 năm 2011 tại 01:10:32
+2

Có thể bạn sẽ phải tắt nó trên toàn cầu để loại bỏ nó. Qt Creator có lẽ không biết cú pháp C++ 11. Ngoài ra, bạn có thể tìm thấy một tùy chọn để đặt nó ở chế độ C++ 11. –

+1

Nó biết tự động, unique_ptr và thậm chí lambdas. Tôi có nghĩa là không có sóng đỏ và biên dịch tốt. –

+1

Điều đó không có nghĩa là nó biết cú pháp 'for' dựa trên phạm vi. –

Trả lời

4

Nếu bạn đang viết bằng C++ 11 bạn nên thay đổi từ việc sử dụng QT Creator làm IDE để sử dụng CDT Eclipse. Ít nhất đây là cách tôi giải quyết vấn đề này. QT Creator dường như không có cách nào để tùy chỉnh kiểm tra cú pháp thời gian thực này. Mặt khác, Eclipse có thể tùy biến rộng rãi trong lĩnh vực này.

Cập nhật: Tôi nghĩ rằng QtCreator đã cải thiện hỗ trợ cho các phiên bản mới hơn của C++ vì câu trả lời này đã được đưa ra, vì vậy nó không còn chính xác nữa. Tôi không thể xóa nó vì nó là một câu trả lời được chấp nhận.

+1

Tôi nên lưu ý ở đây rằng tôi đã thử QT Creator một lần nữa gần đây và hỗ trợ C++ 11 của nó dường như đã được cải thiện. Tôi không nhớ nếu vấn đề cụ thể này đã được sửa chữa mặc dù. –

+0

Tôi sắp sửa downvote nhưng nhận thấy phần Cập nhật. Tôi nghĩ rằng nó sẽ tốt hơn nếu được đặt phía trên câu trả lời ban đầu: không phải ai cũng chú ý đủ để tránh downvoting mà không đọc toàn bộ bài viết. – Ruslan

0

Qt Creator đang sử dụng định nghĩa tô sáng cú pháp từ trình chỉnh sửa Kate (từ KDE). Xem Công cụ chỉnh sửa văn bản-tùy chọn-trình soạn thảo văn bản chung.

Nếu Kate có định nghĩa cho C++ 11, bạn có thể sử dụng nó hoặc bạn có thể tự phát triển.

+1

Làm nổi bật là OK, 'for' và' auto' được in đậm như bình thường đối với từ khóa. Phân tích cú pháp là sai. –

+0

Làm nổi bật cú pháp của Kate cũng xử lý, tốt, cú pháp, không chỉ từ khóa. Dễ nhất là có lẽ để lấy một từ c + + và tinh chỉnh nó. – Koying

+0

Cảm ơn, tôi sẽ kiểm tra. –

5

Có "tô sáng cú pháp" (tô màu) và có "kiểm tra cú pháp" (đường gạch dưới lượn sóng). Màu cú pháp dường như có liên quan đến Kate như @Koying gợi ý, bạn có thể sửa đổi màu sắc và tắt nó đi. Tính đến Qt Creator 2.5.0 nó dường như không có một vấn đề với nhất ví dụ C++ 11 Tôi dán ra khỏi web, mặc dù ví dụ của bạn không thực sự vẫn có gạch dưới:

http://labs.qt.nokia.com/2012/05/09/qt-creator-2-5-0-released/

Cũng không may, tại thời điểm viết bài (ngày 13 tháng 6 năm 2012, khoảng một tháng sau khi phát hành) gói SDK tích hợp mới nhất vẫn cài đặt Qt Creator 2.4.1 theo mặc định. : -/

Nếu đây là chiếc thuyền có người đang ở và muốn thử mới nhất, không làm những gì tôi đã làm bằng cách xoá sạch Qt SDK bạn cài đặt sử dụng /opt/QtSDK/SDKMaintenanceTool! Đó là lãng phí thời gian trên một cài đặt lại, sau đó tôi thực hiện một sudo rm -r /opt/QtSDK/QtCreator, sau đó nói với phát hành Qt Creator mới để cài đặt để /opt/QtSDK/QtCreator. Tôi sẽ cập nhật bài đăng này nếu tôi nhấn một snag với lựa chọn đó!

http://qt-project.org/wiki/Qt_Creator_Releases

NHƯNG mặc dù nó có vẻ làm việc với nhiều C++ 11 cấu trúc nó không làm gì ví dụ của bạn cũng không phải là trường hợp đặc biệt tôi vấp trên, đó là unspaced<nested<syntax>> cho các mẫu.

(Lưu ý: Nó có vẻ như là một điều nhỏ nhặt, nhưng đó là một tính năng C++ 11 lớn đối với tôi .. Tôi ghét đối phó với việc phải làm tailspaced<nested<syntax> > ...dẫn tôi luôn làm fullyspaced< nested<syntax> > trên tất cả các mẫu để giữ mọi thứ nhất quán. Các trường hợp đơn giản như vector<int>. Bây giờ họ đã sửa trình biên dịch, tôi đã sẵn sàng để tiêu diệt tất cả các khoảng trống đó.)

Có vẻ như không có cách nào để tắt đường gạch dưới (unless you recompile Qt Creator ??).

in qt-creator-2.5.0-src\src\plugins\cpptools\cppmodelmanager.cpp: 

     QTextCharFormat errorFormat; 
     /* disable error underline 
     errorFormat.setUnderlineStyle(QTextCharFormat::WaveUnderline); 
     errorFormat.setUnderlineColor(Qt::red); 
     */ 

     // set up the format for the warnings. 
     QTextCharFormat warningFormat; 
     /* disable warning underline 
     warningFormat.setUnderlineStyle(QTextCharFormat::WaveUnderline); 
     warningFormat.setUnderlineColor(Qt::darkYellow); 
     */ 

Dù sao đi nữa, đó là một hậu quả điên rồ khi sao chép công việc của trình biên dịch trong IDE thay vì có hai mã front-end. Chúng ta sống trong thời đại đen tối của phần mềm. Sẽ không ai đó save us? [/ Rant]

Dưới đây là một số mã có liên quan (tôi nghĩ):

https://qt.gitorious.org/qt-creator/qt-creator/blobs/master/src/plugins/cppeditor/cpphighlighter.cpp

... và lexer đây, lưu ý các thành viên _cxx0xEnabled:

https://qt.gitorious.org/qt-creator/qt-creator/blobs/master/src/libs/cplusplus/SimpleLexer.cpp#line80

Bên cạnh cú pháp của bạn, khoảng cách mẫu là điều duy nhất tôi đã tìm thấy trong C++ 11 gây ra các dòng. Đó là đủ lớn với tôi rằng tôi có thể chỉ cần xây dựng QtCreator của riêng tôi để giải quyết nó!

10

Tôi không hiểu dòng lý do trong câu trả lời của Andrew. Tại sao phải tùy chỉnh kiểm tra cú pháp có ý nghĩa? Cú pháp hoặc là đúng cho ngữ cảnh được thiết lập bởi dòng lệnh trình biên dịch, hoặc nó là sai. Nếu nó sai, nó phải được đánh dấu như vậy, nếu không, không. Nếu mã đúng được đánh dấu là sai, đó là lỗi, hoặc ít nhất là tính năng không được hỗ trợ, trong IDE, và nó cần sửa chữa, không phải "tùy chỉnh".

Có nói rằng, ví dụ trích dẫn

int myint[] = {1,2,3,4,5}; 
    for (auto x : myint){/**/} 

hoạt động tốt ở đây (khá gần đây xây dựng từ chi nhánh tổng thể).

Liên quan đến nhận xét khác về Kate: Làm nổi bật cú pháp của Kate được Qt Creator sử dụng làm dự phòng trong trường hợp không có thêm cú pháp cụ thể nào cho một tệp. Trong trường hợp của C++ (98/03/11) có một mô hình mã thực được sử dụng, không phải định nghĩa của Kate.