Duyệt lớp trong C ++


7

Tôi đang làm việc với một cơ sở mã lớn và thường thấy nó tẻ nhạt và khó hiểu các mối quan hệ giai cấp. Tôi đã tìm thấy wiki sau mô tả các công cụ khác nhau để làm việc với OOP trong C ++, nhưng chúng đã lỗi thời hoặc không hoạt động! Những công cụ Emacs nào có sẵn để làm việc với các cơ sở mã OO lớn?

Đây là những gì tôi đã tìm thấy:

  • Trình duyệt hướng đối tượng
    • Chưa được cập nhật từ năm 2002! Không còn tồn tại
  • Ebrowse
    • Tôi thậm chí không thể tìm thấy liên kết tải xuống cho trình phân tích cú pháp ... mục tiêu của tôi sẽ là Windows hoặc Mac OS X Cảm ơn @ tu-do đã chỉ ra nó trong thư mục bin emacs
  • Trình duyệt mã Emacs
    • Chỉ có vẻ hỗ trợ Etags, nhưng không hỗ trợ thẻ toàn cầu hoặc cscope

Câu trả lời:


6

Tôi đang viết một hướng dẫn cho Ebrowse và sẽ phát hành nó trong tuần này .Ebrowse là một trình phân tích cú pháp nhanh được sử dụng để xử lý các tệp nguồn C ++ để tạo ra một cơ sở dữ liệu chứa phân cấp lớp mà sau đó được Emacs xử lý để tạo ra một biểu diễn cây lớp. Nó hơi giống GNU Global, nhưng được tích hợp vào Emacs và tạo ra một cây lớp, do đó sẽ mất nhiều thời gian hơn để xử lý trong cây nguồn lớn.

Để sử dụng Ebrowse:

find . -name '*.cpp' -or -name '*.h' | ebrowse

Thêm phần mở rộng nếu bạn muốn. Nếu dự án của bạn chỉ có hàng trăm tệp, thì = Ebrowse = hoạt động thực sự tốt. Sau khi thực hiện lệnh, một tệp có tên BROWSEđược tạo ra; đây là cơ sở dữ liệu chứa phân cấp lớp. Chỉ cần mở tệp này và Emacs tự động nhận ra tệp và xử lý tệp. Sau khi xử lý xong cơ sở dữ liệu, Emacs hiển thị một chỉ mục của tất cả các lớp trong cơ sở dữ liệu theo định dạng cây: nếu một lớp có nguồn gốc từ một lớp, nó được lồng bên trong lớp cha. Bộ đệm này được gọi là a Tree buffer. Emacs cung cấp ba cách để tương tác với Ebrowse:

  • Tree đệm: một bộ đệm hiển thị cây.
  • Memberđệm: một bộ đệm hiển thị các thành viên của mỗi lớp. Bạn có thể chuyển đổi giữa các khai báo và định nghĩa của một lớp và chuyển đến vị trí của mỗi trong tệp nguồn tương ứng.
  • Sourceđệm: bộ đệm mã của bạn. Bạn có thể tương tác Ebrowse cơ sở dữ liệu như tìm và xem (mở để chỉ đọc) và định nghĩa, mở a = Member = bộ đệm của một lớp có chứa thẻ tại điểm ...

Nếu bạn có một dự án lớn (tức là hơn 10000 tệp cpp), nhưng tất cả các lớp đều nằm trong .htệp, thì đừng thêm .cppnếu không sẽ mất rất nhiều thời gian để tạo BROWSEtệp. Bạn sẽ mất khả năng chuyển sang định nghĩa mặc dù; nhưng điều này có thể được thực hiện bằng cách sử dụng ctagshoặc GNU Global. Điều quan trọng nhất là xem hệ thống phân cấp lớp Tree buffervà đây là lợi thế của Ebrowse.

Hướng dẫn WIP ở đây .

Cập nhật : Ngoài ra, bạn có thể sử dụng doxygen để tạo tất cả các loại biểu đồ (biểu đồ người gọi / callee, biểu đồ phụ thuộc, biểu đồ phân cấp lớp ...) nhưng cũng mất nhiều thời gian để tạo tất cả, ngay cả đối với cây nguồn nhỏ như ipxe . Đây không phải doxygenlà chậm, trên thực tế nó khá tối ưu, nhưng để tính toán sự phụ thuộc cho toàn bộ cơ sở mã không phải là một nhiệm vụ tầm thường.

Phần thưởng : Nếu bạn làm việc với C và muốn xem biểu đồ cuộc gọi, hãy sử dụng GNU Cflow. Xem thông báo Reddit của tôi .


Điều này nghe có vẻ ngớ ngẩn, nhưng tôi có thể tìm thấy "thực thi" ở đâu? Nó không có sẵn cho Windows hoặc Mac OS X?
táo tợn

@cheezy Nó được cài đặt cùng với Emacs. Vì vậy, nếu bạn cài đặt Emacs, nó sẽ nằm trong binthư mục chứa Emacs. Vì vậy, nếu bạn có thể chạy emacstrong dòng lệnh, bạn sẽ có thể chạy ebrowse.
Từ Đô

@cheezy btw, đã hoàn thành công việc cho bạn?
Từ Đô

+1 hoàn toàn cho cú pháp Org. Ồ, và tôi đoán câu trả lời cũng tốt :)
Sean Allred

@Sean ALLred woot không nhận thấy điều đó. Đã sửa :)
Từ Đỗ

2

Bạn có thể có một giao diện helm đẹp để sử dụng tương tác cscope:

http://wikemacs.org/wiki/Python#Indexing_source:_ctags.2C_cscope.2C_pycscope

https://github.com/sergey-pashaev/mus-cscope

Chúng tôi sau đó có chức năng như M-x helm-cscope-find-global-definitioncó sẵn. Việc điều hướng nhanh hơn.


Nhưng, điều anh ta muốn là một cái nhìn tổng quan về hệ thống phân cấp lớp, không phải điều hướng và điều này là duy nhất với Ebrowse, vì công cụ điều hướng khả thi duy nhất anh ta có cho dự án của mình là etags bảng Làm hoàn thành thẻ Thẻ
Tu Do

mmh, IMO (s) anh ấy không chỉ tìm kiếm một cái nhìn tổng quan về hệ thống phân cấp lớp (mặc dù có tiêu đề), nhưng đối với "công cụ [có sẵn] để làm việc với các cơ sở mã OO lớn". cscopegiúp cho điều đó (tốt hơn etags) và là từ cuối cùng của câu hỏi của anh ấy :)
Ehvince

Trong chủ đề trước đây của mình, ông đã tuyên bố rằng chỉ etagscó thể sử dụng được với dự án, mặc dù đã thử các giải pháp khác như GNU Global (chắc chắn là tốt hơn ctags). Nhưng đối với hệ thống phân cấp lớp, Eborwse hoặc công cụ bên ngoài như Doxygen là một lựa chọn khả thi. Và câu đầu tiên là "Tôi đang làm việc với một cơ sở mã lớn và thường thấy nó tẻ nhạt và khó hiểu các mối quan hệ giai cấp " :)
Tu Do

Ồ, có vẻ như bạn đang đề cập đến một chủ đề khác (mà tôi không biết). cscopekhông giúp gì cho các mối quan hệ của lớp vì chúng ta có thể "tìm ai gọi lớp này" và những thứ tương tự. ok, tôi không hoàn hảo trong môn học, nhưng vẫn có chỗ đứng của mình :)
Ehvince
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.