2009-07-16 41 views
14

Tôi đang tái cấu trúc một số mã trong C++ và tôi muốn ngừng sử dụng một số phương pháp cũ. Phương pháp hiện tại của tôi để tìm tất cả các phương pháp trông giống như sau:Làm thế nào để Tìm tất cả người gọi của một hàm trong C++?

  1. Nhận xét phương thức gốc trong tệp nguồn mà tôi đang làm việc.
  2. Cố gắng biên dịch mã.
  3. Nếu tìm thấy lỗi trình biên dịch, sau đó ghi chú nhận xét ra khỏi cuộc gọi và cố gắng biên dịch lại.
  4. Khi biên dịch đã hoàn tất thành công, tôi đã tìm thấy tất cả các cuộc gọi.

Điều này hoàn toàn không được. Tôi cũng đã cố gắng tìm nguồn cho tên gọi hàm, nhưng đôi khi tôi gặp phải các vấn đề với các hàm có cùng tên với các đối số khác nhau, do đó trình biên dịch của tôi làm cho trình biên dịch C++ giải quyết các tên cho tôi. Tôi đã tìm thấy this question cho C#, nhưng cơ sở mã của tôi hoàn toàn được triển khai trong C++.

Có cách nào tốt hơn để tìm tất cả người gọi phương thức hoặc hàm lớp trong C++ không? Tôi đang sử dụng GCC trên các hệ thống Unix, nhưng các giải pháp đa nền tảng sẽ là bậc nhất.

+0

Tôi rất muốn nghe một giải pháp tốt, nhưng có vẻ như với tôi bạn phải sao chép toàn bộ giao diện người dùng. Đó là khá nhiều những gì nó sẽ làm để xây dựng bảng biểu tượng. –

+1

Thử [CodeQuery] (https://github.com/ruben2020/codequery). Nó kết hợp tốt nhất của cscope và ctags, để tạo ra thông tin mã nguồn tốt hơn của C++. Disclaimer: Đó là dự án nguồn mở của tôi. – ruben2020

Trả lời

32

GCC cho phép bạn trang trí các biến, hàm và phương thức với __attribute__((deprecated)), điều này sẽ gây ra cảnh báo trên tất cả các cuộc gọi (trừ khi -Wno-deprecated-declarations được cung cấp).

class A { 
public: 
    A() __attribute__((deprecated)) {} 
}; 
int main() { 
    A a; 
} 
 
$ g++ test.c 
test.cc: In function ‘int main()’: 
test.cc:6: warning: ‘A::A()’ is deprecated (declared at test.cc:3) 
+1

Tốt. Kể từ khi OQ đang sử dụng GCC (và không đề cập đến các nền tảng khác), đây là những gì tôi muốn làm. –

+8

Đối với bất kỳ ai sử dụng studio trực quan, có chức năng tương tự với #pragma không được chấp nhận (tên hàm). Xem http://msdn.microsoft.com/en-us/library/044swk7y.aspx – Eclipse

+0

Đây là câu trả lời đúng cho tôi, bởi vì tôi đang tái cấu trúc, tôi sẽ không cần các thuộc tính là nền tảng chéo. Đồ tốt! –

2

Đó là khá nhiều cách tôi làm điều đó. Nếu mã của bạn là tất cả cùng một lúc một "grep" (hoặc tìm | grep combo) có thể làm các trick quá.

Một caviat: Phương pháp này sẽ rất thường xuyên bỏ lỡ các trường hợp không được biên dịch theo điều kiện vào cấu hình hiện tại của bạn. Nếu mã của bạn sử dụng #ifdef để hỗ trợ nhiều cấu hình, một người thấu đáo sẽ cố gắng biên dịch với mọi cấu hình để bắt tất cả các trường hợp.

+0

Đó là một điểm thực sự tốt. May mắn là chúng tôi không có quá nhiều ifdef trong mã của chúng tôi, và tôi không mong đợi nhiều cho dự án tái cấu trúc đặc biệt này, nhưng đó là một lý do khác khiến tôi cần một mẹo tốt hơn. :) –

4

Tôi nghĩ rằng những gì bạn muốn là nhìn vào một đồ thị cuộc gọi. Xem this question để biết một số gợi ý tốt về cách thực hiện điều đó.

+0

Cảm ơn bạn đã liên kết! Tôi không thấy câu hỏi đó trong tìm kiếm của mình. –

6

Một tùy chọn là chạy toàn bộ dự án của bạn thông qua một chương trình như Cscope. Mà về cơ bản phân tích toàn bộ mã nguồn của dự án của bạn và xây dựng cơ sở dữ liệu cho phép dễ dàng tìm kiếm những thứ như tất cả người gọi của một chức năng, tất cả các tham chiếu, v.v.

Tôi biết nó hoạt động khá tốt cho C, hoạt động hiệu quả đối với C++. KScope là giao diện người dùng GUI của KDE cho nó.

+2

Drat. Tôi đã hy vọng cho đến khi tôi đọc của bạn "họ tuyên bố nó hoạt động decently cho C + +". Dựa trên bài viết của bạn, tôi nghĩ bạn đang nói từ kinh nghiệm tay đầu tiên. Tôi là một fan hâm mộ lớn của cscope cho mã C, thậm chí lớn, phức tạp mã C, nhưng tôi đã có kết quả rất hỗn hợp với C + +. Tôi đoán thay vì than thở tôi nên cố gắng sửa chữa cscope, vì nó trên Sourceforge sau khi tất cả ... – Dan

4

Đối với bất cứ ai muốn làm điều này trong Visual Studio dưới cửa sổ ....

Visual Assist là thực sự tốt. Nó giúp ích rất nhiều với việc tái cấu trúc C++, gọi đồ thị, đổi tên, tự động tạo định nghĩa tiêu đề hoặc phương thức tạo từ định nghĩa, v.v. Nó không hoàn hảo, không có gì giống như chất lượng của các công cụ tái cấu trúc Java/C#, nhưng thực sự tốt cho C++ !!

10

Eclipse có thể thực hiện việc này mà không cần bất kỳ plugin nào. Nó có thể là một công cụ hữu ích cho các công cụ như thế này ngay cả khi bạn không muốn sử dụng nó cho trình soạn thảo hàng ngày của bạn.

  1. Tải xuống, cài đặt và chạy Eclipse CDT.
  2. Đi theo Dự án Tệp, Mới, C++. Nhập tên dự án và chọn một dự án Empty Makefile từ khung nhìn cây Project Type. Bỏ chọn "Sử dụng vị trí mặc định" và nhập thư mục nơi dự án của bạn được lưu giữ.
  3. Nhấp vào Tiếp theo, sau đó nhấp vào Hoàn tất.
  4. Eclipse sẽ tự động bắt đầu lập chỉ mục dự án của bạn. Nếu nó thực sự là một dự án Makefile, và vì bạn đang sử dụng g ++, bạn có thể làm sạch toàn bộ rồi xây dựng từ bên trong Eclipse (dưới menu Project), và nó sẽ tự động sử dụng các tệp makefiles hiện có của bạn và tự động khám phá các thư mục bao gồm của bạn và Thiết lập dự án.
  5. Tìm nguyên mẫu của hàm bị quá tải trong tệp nguồn, nhấp chuột phải vào nó, chọn Tham khảo và chọn Dự án. Eclipse sẽ tìm tất cả các tham chiếu đến hàm đó, và chỉ cho quá tải cụ thể của hàm đó, trong dự án của bạn.

Bạn cũng có thể sử dụng hỗ trợ tái cấu trúc sẵn có của Eclipse để đổi tên các hàm bị quá tải để chúng không còn quá tải. Eclipse cũng hoàn toàn đa nền tảng; bạn có thể sử dụng các tính năng như trình lập chỉ mục của nó, các tham chiếu tìm kiếm và tái cấu trúc ngay cả đối với các dự án được duy trì và được xây dựng trong các IDE khác.

+1

Simul-trả lời! Tôi trì hoãn câu trả lời hoàn chỉnh hơn của bạn và trao cho bạn một câu trả lời :-) –

2

Nếu bạn để chỉ số Eclipse CDT lập chỉ mục nguồn gốc của mình, thì bạn sẽ có thể xem hệ thống phân cấp gọi cho bất kỳ chức năng nào và thậm chí thực hiện một số phép tái cấu trúc.

Bạn có thể download IDE Eclipse cho nhà phát triển C/C++ (hy vọng bạn có thể tìm thấy cổng cho NIX cụ thể của bạn) và theo dõi instructions để bắt đầu.

2

Trong visual studio, nhấp chuột phải vào tên hàm và bấm vào nút "Gọi trình duyệt"> Show Người gọi đồ thị

Sau đó, trong cửa sổ hiển thị có nên được một thư mục có tên "Các cuộc gọi đến chức năng" có chứa tất cả những nơi mà gọi hàm đó, mỗi chức năng mà bạn có thể nhấp đúp để truy cập chúng trong mã.

+0

Trong bản dựng mới hơn của VS, mục menu ngữ cảnh được đặt tên là Phân cấp cuộc gọi. –

+0

Trong VS 2013 có vẻ như là Xem Gọi Hierachy. – Watusimoto

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