2009-10-15 48 views
19

Tôi muốn làm điều này:Extracting C/C++ chức năng nguyên mẫu

extract_prototypes file1.c file2.cpp file3.c 

và có bất cứ điều gì kịch bản/chương trình in một danh sách tốt đẹp của nguyên mẫu chức năng cho tất cả các chức năng được xác định trong các tập tin C/C++ nhất định. Nó phải xử lý các khai báo nhiều dòng một cách độc đáo.

Có chương trình nào có thể thực hiện công việc này không? Đơn giản càng tốt.

EDIT: sau khi cố gắng biên dịch hai chương trình C, điểm thưởng cho nội dung nào đó sử dụng {perl, python, ruby}.

Trả lời

14

Công cụ cproto thực hiện những gì bạn muốn và cho phép điều chỉnh đầu ra theo yêu cầu của bạn.

Lưu ý: Công cụ này cũng chỉ hoạt động đối với tệp C.

+0

argh, gặp khó khăn trong việc biên soạn các công cụ tối nay có vẻ như (trên mac). có vẻ tốt ... – Peter

+1

Không phải là một công cụ độc lập. Nó cần cài đặt gcc (thử trên các cửa sổ). – rxantos

+0

Lưu ý rằng cproto không còn hoạt động chính xác trên gcc 4.5 trở lên, do thay đổi về cách gcc xử lý các tệp tiêu đề bị thiếu. (https://gcc.gnu.org/bugzilla/show_bug.cgi?id=55115) –

3

http://cfunctions.sourceforge.net

(Điều này chỉ thực hiện C và một tập hợp con hạn chế về C++ Disclaimer:.. Đây là chương trình của tôi)

+1

hmm, nó không biên dịch. – Peter

+0

Cảm ơn bạn đã cho tôi biết. –

+0

đây là một phần thông tin hữu ích hơn một chút, trong trường hợp nó giúp ... http://pastie.org/655762 – Peter

1

tôi sử dụng để sử dụng doxygen để tạo ra tài liệu cho mã C++ của tôi. Tôi không phải là một chuyên gia, nhưng tôi nghĩ rằng bạn có thể sử dụng doxygen để tạo ra một số loại tập tin chỉ mục của các nguyên mẫu chức năng.

Đây là một thread của một người nào đó hỏi một câu hỏi tương tự

+0

Gah, bị đánh đập. Tôi đồng ý mặc dù :-) –

1

Nếu bạn định dạng bình luận của bạn cho phù hợp, bạn có thể thử DOxygen. Trong thực tế, nếu bạn không thử nó trước khi tôi khuyên bạn nên cho nó đi anyway - nó sẽ tạo ra đồ thị thừa kế cũng như danh sách chức năng thành viên đầy đủ và mô tả (từ ý kiến ​​của bạn).

+0

yeah, được xuống con đường doxygen và tôi sau khi một cái gì đó đơn giản hơn nhiều cho công việc này một. (Tôi sẽ để lại cuộc thảo luận về giá trị của doxygen cho một chủ đề khác.) – Peter

+0

Bạn thực sự không phải bình luận gì cả. Chỉ cần đảm bảo Doxyfile của bạn có tùy chọn tạo tài liệu cho tất cả các thành viên được bật. Nhưng đã đồng ý, đây là công việc khá phức tạp, mặc dù IIRC có một tùy chọn đầu ra XML mà bạn có thể thử phân tích cú pháp. – blwy10

0

gcc-xml có thể trợ giúp, mặc dù hiện tại, nó chỉ thực hiện một nửa công việc bạn muốn. Bạn sẽ cần xử lý một số kết quả đầu ra XML

+0

[rbgccxml] (https://github.com/jasonroelofs/rbgccxml) dường như làm phần còn lại. Nó sử dụng một viên ngọc ruby ​​khác gọi là nokogiri để phân tích cú pháp XML. – Sundar

1

gccxml thật thú vị, nhưng nó in một cây xml. Bạn cần trích xuất thông tin về lớp, chức năng, loại và thậm chí cả các mẫu chuyên biệt của lớp và chức năng. gccxml sử dụng trình phân tích cú pháp của GCC, vì vậy bạn không cần phải làm công việc tồi tệ nhất là phân tích cú pháp tệp C++ và bạn chắc chắn rằng 100% đó là trình biên dịch tốt nhất có thể hiểu được.

33

tôi sử dụng ctags

# p = function declaration, f = function definition 
ctags -x --c-kinds=fp /usr/include/hal/libhal.h 

Cũng làm việc với

C++
ctags -x --c++-kinds=pf --language-force=c++ /usr/include/c++/4.4.1/bits/deque.tcc 

Lưu ý, bạn có thể cần thêm bao gồm đường dẫn, thực hiện điều này bằng cách sử dụng -I /path/to/includes.

+0

Một điều đáng tiếc mà bạn sẽ cần phải lọc kết quả. Nếu không nó sẽ có được hoàn hảo. Kết quả là theo hình thức – rxantos

+0

Khi tôi sử dụng thử này tôi nhận được lỗi "ctags: unrocognized tùy chọn '--c-loại = fp' .Tôi đang sử dụng ctags.exe trên windows. Bất kỳ ý tưởng về lý do tại sao tôi nhận được lỗi này? – mashrur

+0

Điều này chỉ hoạt động nếu các khai báo không bị hỏng trên nhiều dòng, ít nhất là với Exagerant Ctags 5.8. – mondaugen

0

Bạn có thể chạy các tập tin nguồn thông qua chương trình này:

/* cproto_parser.c */ 
#include <stdio.h>       
int main (void)        
{            
    int c;         
    int infundef = 0;       
    int nb = 0,        
     np = 0;        
    while((c=getc(stdin))!=EOF){    
     if(c=='{'){       
      if((np==0)&&(nb==0)){infundef=1;} 
      nb++;        
     }          
     if (infundef==0) {putc(c,stdout);} 
     if(c=='}'){       
      if((np==0)&&(nb==1)){infundef=0;} 
      nb--;        
     }          
     if(c=='('){np++;}      
     if(c==')'){np--;}      
    }           
    return 0;         
}      

Chạy qua tiền xử lý để thoát khỏi ý kiến. Nếu bạn có dấu ngoặc nhọn chưa khớp do #ifdefs bạn phải đặt định nghĩa, bao gồm các tệp để làm cho nó không phải như vậy.

ví dụ:, cc cproto_parser.c -o cproto_parser; cc -E your_source_file.c|./cproto_parser

+0

Hãy chuyển sang ngôn ngữ phù hợp hơn. – mondaugen

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