2009-12-19 44 views
14

Bất kỳ đề xuất nào về cách chất lượng để gắn thẻ và tìm kiếm mã C++. Tôi sử dụng cscope/ctags cho hầu hết các công cụ, nhưng tôi đã tìm thấy nó không đủ để tìm cách của tôi xung quanh một số mã C++ quá phức tạp trong công việc. Tôi đã bắt đầu chuyển từ vim sang Slickedit (mà vẫn không hoàn hảo, nhưng tốt hơn) để duyệt mã, nhưng muốn quay trở lại độc quyền vim.Gắn thẻ nguồn C++

Điều tôi muốn là hiểu được phạm vi của các thành viên lớp, ví dụ, nếu tôi tìm kiếm các tham chiếu tới thành viên của một lớp có cùng tên thành viên trong các lớp khác (và có thể nằm ngoài mã C++) nó sẽ chỉ cho tôi những tài liệu tham khảo liên quan.

Tôi muốn một cái gì đó đã hoạt động tốt đẹp với vim, nhưng bất kỳ gói nguồn mở nào mà tôi có thể tự tạo một plugin sẽ ổn.

Bất kỳ đề xuất nào được đánh giá cao, cảm ơn.

+0

Tôi có cùng một sự cố khi sử dụng ctags: bằng cách sử dụng lệnh ': tags NamespaceName :: ClassName :: methodName' mọi thứ ok, nhưng đặt con trỏ lên trên tên phương thức và nhập 'CTRL +]' , Tôi phát hiện ra rằng bằng cách sử dụng 'g +]' chúng hiển thị một danh sách các thẻ hơn là bạn có thể chọn kết hợp chính xác. Điều tốt nhất với tôi là một kịch bản để phân tích mã hiện tại và gọi chính xác ': tag' –

Trả lời

0

Tôi chưa có kinh nghiệm về điều này, nhưng tôi đã sử dụng Doxygen để duyệt mã nguồn của các dự án phức tạp. Chỉ cần chạy nó với tất cả các cài đặt được bật và nó sẽ tạo biểu đồ cuộc gọi, biểu đồ callee, tham chiếu và tham chiếu theo quan hệ, mẫu tức thời, vv. Định dạng đầu ra bao gồm HTML, LaTeX, CHM, POD

Hy vọng công việc này!

9

sử dụng doxygen công cụ tuyệt vời để duyệt mã và xem các lớp và mối quan hệ thành viên với nhau. công cụ này tạo ra đầu ra html có thể nhấp cho mã nguồn của bạn với các tham chiếu cho mỗi lần sử dụng. bạn có thể biên dịch nó thành tệp chm có thể tìm kiếm hoặc sử dụng máy chủ web để tìm kiếm mã cho từ khóa.

0

Trong một thời gian tôi đã trộn các công cụ khác nhau cho mục đích này. Vi là một trình soạn thảo tuyệt vời và bạn có thể chạy nó trên các máy tính từ xa mà không phức tạp, nhưng thông tin hoàn thành không phải là ngữ nghĩa.

Khi đối mặt với một vấn đề lớn, tôi có xu hướng sử dụng Eclipse CDT hoặc QTCreator, trong cả hai trường hợp phiên bản mới nhất, các phiên bản từ một năm trở lại không thực sự tốt đẹp như vậy. QTCreator là một công cụ nhẹ, nhưng tôi đã khá ấn tượng về khả năng phân tích mã của nó. CDT Eclipse có trọng lượng nặng hơn, nhưng tôi sử dụng nhiều hơn một chút so với giao diện, vì vậy cuối cùng tôi có xu hướng sử dụng nó.

Dự án tôi đang làm được biên soạn trong một hộp cát riêng biệt, nơi không thể sử dụng hai IDE này, nhưng bạn có thể lấy bản sao của kho chỉ để phân tích và sử dụng IDE như một công cụ duyệt.

25

Bạn có chắc chắn bạn đã gọi ctags với các tùy chọn phù hợp không? Đối với C++, tôi sử dụng:

ctags --c++-kinds=+p --fields=+iaS --extra=+q --language-force=C++

Đây là những gì các tài liệu có nói về --c++-kinds=+p tùy chọn:

Khi phân tích một hàm C++ thành viên định nghĩa (ví dụ "className :: chức năng"), ctags không thể xác định cho dù phạm vi specifier là một tên lớp hoặc một không gian tên specifier và luôn luôn liệt kê nó như là một tên lớp trong phạm vi phần của các lĩnh vực mở rộng. Ngoài ra, nếu hàm C++ được xác định bên ngoài khai báo lớp (trường hợp thông thường), thông số truy cập (tức là công khai, được bảo vệ hoặc riêng tư) và thông tin triển khai (ví dụ ảo ảo thuần túy) có trong khai báo hàm không biết khi nào thẻ được tạo cho hàm định nghĩa.Tuy nhiên, nó sẽ có sẵn cho các nguyên mẫu
(ví dụ: --C++ - types = + p).

Các --fields=+iaS tùy chọn:

a Access (or export) of class members 
i Inheritance information 
S Signature of routine (e.g. prototype or parameter list) 

Các --extra=+q tùy chọn:

Bởi vì, theo mặc định, chỉ ctags tạo thẻ cho các định danh riêng biệt được tìm thấy trong các tập tin nguồn. Nếu bạn chỉ định tùy chọn --extra = + q, thì ctags cũng sẽ tạo ra một thẻ thứ hai là , đủ điều kiện cho từng thành viên lớp (dữ liệu và hàm/phương thức) trong lớp biểu mẫu :: thành viên cho C++ và trong biểu mẫu class.method cho Eiffel và Java.

Các --language-force=C++ tùy chọn:

Theo mặc định, ctags tự động chọn ngôn ngữ của một tập tin nguồn, bỏ qua các tập tin mà ngôn ngữ không thể được xác định (xem NGUỒN FILES, ở trên). Tùy chọn này buộc ngôn ngữ được chỉ định (không phân biệt chữ hoa chữ thường, được tích hợp sẵn hoặc do người dùng xác định) được sử dụng cho mọi tệp được cung cấp thay vì tự động chọn ngôn ngữ dựa trên phần mở rộng của nó. Ngoài ra, giá trị tự động đặc biệt cho biết ngôn ngữ sẽ được chọn tự động (điều này sẽ vô hiệu hóa tùy chọn này một cách hiệu quả).

+1

Câu trả lời hay, tôi đã sử dụng dòng lệnh ctags cũ của tôi trong nhiều năm mặc dù tôi làm nhiều hơn C++ những ngày này. Đoán tôi không bao giờ nghĩ để đọc trang người đàn ông và xem nếu tôi cần thiết để thêm nhiều lựa chọn hơn cho C + +. Rất hữu ích. – Dan

1

Hãy thử GNU toàn cầu http://www.gnu.org/software/global/

Nó có thể tạo ra điều hướng: các trang web có thể của mã nguồn của bạn cũng như có sự hỗ trợ cho vim và một giao diện dòng lệnh đó là thường hữu ích.

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