2011-12-22 34 views
5

Tôi đã tự hỏi nếu có một công cụ (có thể trình biên dịch GNU C++) để lấy từ một tệp .cpp đầy đủ các chức năng tệp .hpp với các khai báo hàm đã đề cập.Cách trích xuất khai báo (tệp .hpp) từ việc triển khai (tệp .cpp)?

Ví dụ:

tôi có:
magic.cpp

int foo() { return 42; } 
char bar() { return 'z'; } 

Và tôi muốn có được điều này sau khi áp dụng các công cụ tuyệt vời:
magic.hpp

int foo(); 
char bar(); 
+0

thể trùng lặp của [Seeking tạo mã còn sơ khai (từ các tập tin tiêu đề)] (http: // stackoverflow .com/68568/search-code-stub-generator-from-header-files) –

+0

Tìm kiếm và thay thế '{' bằng ';/*' và '}' bằng '* /' sẽ thực hiện, mặc dù không phải là giải pháp tốt. – Pubby

+0

@Tim: Đó là cách khác, không? – Xeo

Trả lời

3

Vui lòng xem Dehydra or Treehydra. Một trong hai công cụ này sẽ cho phép bạn thực hiện điều này thông qua GCC.

Dehydra là công cụ phân tích tĩnh có mục đích chung, gọn nhẹ, có thể viết được, có thể phân tích ứng dụng cụ thể mã C++.

2

Để làm điều này một cách chính xác, bạn cần trình phân tích cú pháp và phân tích tên đầy đủ C++ vì bạn không chỉ cần khai báo hàm mà còn là ngữ cảnh làm cho chúng được xác định rõ. Ví dụ, nếu bạn có một tuyên bố

void foo<T>(...){ ... } 

trong tập tin, và có một loại T trong file, bạn giữ lại tốt hơn việc khai báo cho T, và bất cứ điều gì tờ khai được sử dụng để xác định T, vv Vì vậy, bạn có giữ cho trang web của các định nghĩa hỗ trợ foo ... và bạn phải quyết định xem bạn có muốn giữ những định dạng có chứa tệp hay không.

DMS Software Reengineering Toolkit là máy phân tích và chuyển đổi chương trình mục đích chung có thể tùy chỉnh của chúng tôi. Với C++ Front End, người ta có thể phân tích cú pháp mã C++ (bao gồm cả #includes), xây dựng Abstract Syntax Trees (ASTs), phân giải tên và loại ra khỏi hộp. Sau đó, mã tùy chỉnh sẽ xác định trang web của các tham chiếu cần thiết và cho mỗi tham chiếu, chuyển đổi nó thành chữ ký (thay vì triển khai) nếu cần, bằng cách áp dụng source-to-source program transformations cho các AST. Dp của prettyprinter sau đó có thể sản xuất văn bản đầu ra cuối cùng.

DMS đã được sử dụng cho quy mô lớn C++ (lại) kỹ thuật trên các dự án lớn khác.

Tất nhiên, bạn luôn có thể viết một số lỗi xấu để mô phỏng điều này, nếu bạn không nhớ câu trả lời, bạn có thể phải vá bằng tay.

+0

Câu trả lời hay! Tôi đã tự hỏi nó không phải là dễ dàng. Nhưng tôi sẽ không bao giờ nghĩ rằng nó không được giải quyết trong thế giới nguồn mở. Ngay bây giờ, những gì tôi viết là mã cho một dự án khóa học cho trường đại học của tôi, vì vậy những gì bạn đang cung cấp cho tôi nằm ngoài phạm vi. Tuy nhiên nó có vẻ là công cụ thích hợp. Tôi sẽ chờ đợi một giải pháp chung thân thiện hơn, nhưng nếu điều đó không bao giờ xảy ra thì tôi nghĩ đây là giải pháp tốt nhất hiện có. – msemelman

4

On phân phối Debian-based:

apt-get install cproto 

Sau đó cproto magic.cpp cho đầu ra sau đây:

/* magic.cpp */ 
int foo(void); 
char bar(void); 
+0

Rất tiếc! câu trả lời chính xác! – msemelman

+0

Ồ không, nó chỉ hoạt động đối với C (đồng bằng C). Tôi đang tìm kiếm một công cụ C++. Dù sao cũng cảm ơn bạn! – msemelman

+0

Xin lỗi về điều đó, tôi không biết. –

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