2010-03-26 9 views
10

Tôi đang phát triển một chương trình C++ lớn và bây giờ tôi đã quyết định lập tài liệu với Doxygen. Có rất nhiều lớp, phương pháp, chức năng, macro và v.v. Vì vậy, tôi đang tìm kiếm phần mềm có thể quét cây nguồn của tôi và chèn các chú thích Doxygen vào đầu mỗi "mục có thể tài liệu" để cho phép tôi chỉnh sửa chúng sau này và thêm các chi tiết như mô tả phương pháp và vân vân.Bất kỳ phần mềm nào để tự động tạo các khối nhận xét doxygen?

Có phần mềm nào tồn tại không?

Tôi đang theo GNU/Linux với Mã :: Blocks IDE, vì vậy không cần plugin Visual Studio.

Trả lời

1

Bạn cũng có thể đặt Doxygen để trích xuất các mục không được ghi tài liệu - có thể làm những gì bạn muốn mà không thêm bất kỳ khối nhận xét nào vào mã.

Sau đó bạn có thể tạo mẫu/macro (tùy thuộc vào IDE của bạn) để tạo các khối được định dạng trước cho từng loại mục, khi bạn từ từ làm việc thông qua mã tài liệu từng mục một.

[sửa] Nếu bạn đang sử dụng Visual Studio, một số nội dung có sẵn trên lớp và các cấu trúc khác trong tệp, điều đó có thể hữu ích. Ngoài ra, hãy xem Doxycomment - đó có thể là một số thứ bạn muốn.

+1

Tôi biết tính năng đó, nhưng tôi muốn có các nhận xét đó trong mã nguồn. –

+0

Bạn cũng có thể dễ dàng tạo các mẫu * trống * cho các khối bạn muốn thêm vào. Lấy một số dữ liệu vào các mẫu đó tự động có thể phức tạp hơn - nhưng hãy kiểm tra Doxycomment. –

+0

Tôi đang theo GNU/Linux với Code :: Blocks IDE, vì vậy không cần plugin VisualStudio. –

5

Tôi khá lúng túng ở đây.

Mục tiêu tự động tạo nhận xét là gì?

Comments có nghĩa là để mang lại giá trị bổ sung:

/** 
* \brief: finds the person based on its name 
* \param: name, the name of the person 
* \result: the person 
*/ 
Person findPerson(Name name); 

là không có gì nhưng mã lộn xộn mà làm tắc nghẽn bất động màn hình có giá trị của tôi. Và đó là về nhiều như có thể được tạo ra tự động không may ... Thông báo đặc biệt rằng tôi không có ý tưởng về những gì sẽ xảy ra nếu bao giờ các chức năng không tìm thấy người, mà chắc chắn có vẻ như khả năng: nó hủy bỏ? ném? (cái gì ...?) trả về một đối tượng được xây dựng mặc định?

Mặt khác:

/// 
/// Try an exact match approach to begin with 
/// Uses the double metaphone algorithm 
/// if none was found as we have 
/// a western european clientele 
/// 
Person findPerson(Name name) 
{ 
} 

là nhiều thú vị hơn!

  • Bây giờ tôi biết bộ sưu tập kỳ lạ này của if mà dường như được thực hiện một số loại công nhận âm thanh là gì ...
  • Tôi biết tên của nó vì vậy tôi có thể nhìn nó lên trên Internet để kiểm tra việc thực hiện (chức năng)
  • và tôi biết lý do tại sao nó được chọn và do đó khi tôi cần đánh giá lại việc sử dụng nó (phù hợp với một châu Âu khách hàng phương tây vì vậy nếu chúng tôi phát triển trên thị trường arabic nó sẽ cần phải thích ứng ...)

Thật không may, đó là sẽ không được tạo tự động.

+0

Tôi nghĩ câu hỏi đó rất có giá trị. Trong một dự án tốt, có rất nhiều ý kiến ​​trên, vì hầu hết các thói quen có thể được mong đợi là không tầm thường. Đối với một người sắp học hoặc duy trì mã, mỗi dòng đơn (thông minh) đều có giá trị. Trong trường hợp bạn có, nói rằng, 30.000 dòng mã vừa phải và bị ghi sai, một công cụ nhỏ theo yêu cầu của tác giả có thể là một phúc lạc, nếu bạn muốn đọc mã và tự mình tạo tài liệu. – shuhalo

+0

Bạn đang quên số lượng lớn các dòng được viết không phải dành cho niềm vui của một người mà là công việc hợp pháp, tỉnh táo, khô khan, nơi ai đó! = Bạn đã thiết lập một kiểu mã hóa. Bạn có thể cố gắng chống lại điều không thể tránh khỏi hoặc bạn chỉ cố gắng thích ứng với nỗ lực ít nhất có thể. – Vroomfondel

+0

@Vroomfondel: có một câu chuyện nổi tiếng (và có khả năng được tạo ra) về một người quản lý mới đang bế tắc và yêu cầu từ bây giờ vào cuối mỗi tuần, các nhà phát triển nên báo cáo cho anh ta số dòng họ thêm vào codebase. Cuối tuần, báo cáo của nhà phát triển seniormost có: -16.000 dòng. Nếu bạn thấy mình trong tình huống như vậy, có thể đã đến lúc tìm kiếm một công việc tốt hơn; ai đó lãng phí thời gian của mọi người ở một vị trí quyền lực là không bao giờ tốt. –

2

Ok, vì vậy đây là một bài đăng cũ, nhưng tôi chỉ có cùng một vấn đề và tôi đã tìm thấy doxymac. Nó tích hợp độc đáo với các emacs và tạo ra các chú thích doxymac cho các hàm và các tệp của bạn. Sau khi đặt.tập tin el trong đường dẫn emacs của bạn, bạn có thể thêm một móc để làm cho nó có sẵn bất cứ khi nào bạn mở một tập tin C/C++ "(thêm-móc 'c-mode-common-hook'doxymacs-mode)" và bình luận các chức năng với Cc df và các tệp có Cc di, có các loại bình luận khác, chỉ cần kiểm tra trang dự án: http://doxymacs.sourceforge.net/

1

Có một số trình phân tích c/cpp trong python, có thể được sử dụng cho mục đích cụ thể của bạn. Tuy nhiên, tôi chưa bao giờ sử dụng chúng.

Đối với một mục tiêu tương tự, tôi đã viết một tập lệnh python thêm "doxygen-headers" vào các phương thức trong tệp tiêu đề lớn. Tôi đã sử dụng biểu thức chính quy, và tôi có một phiên bản thêm "tiêu đề doxygen" trong tệp nguồn cho các định nghĩa phương thức (sử dụng RE_M_DEFINITION, tại phương pháp tra cứu).

Mã để bạn tham khảo, như sau:

genDoxygenC.py

#!/usr/bin/python 

import os 
import sys 
import re 

################################################################ 

RE_MULTI_LINE_PARAMS = ".*" 

# could be used in header/source files, for method-definition extraction 
RE_M_DEFINITION = r'[A-Za-z0-9*]*\s*[A-Za-z0-9_*]+\s*[A-Za-z0-9_~:*]+\(.*\)\s*\{\s*.*?\s*\}' #TODO: this needs to be more generic to              be able to parse for methods only 
# used in header-files in major for method declaration extraction 
RE_M_DECLERATION = r"[A-Za-z0-9*]*\s*[A-Za-z0-9_*]+\s+[A-Za-z0-9_~*]+\s*\(%s\)\s*;"%RE_MULTI_LINE_PARAMS 

################################################################ 

# C/CPP CMD List 
cmdList = ["for","if","while","switch","else"]; 

########################## 
# exit errors enumerations 
class EErrors() : 
    IncorrectUsage, FileOpenError = range(2) 

################### 
# exception handler 
def handleException(e, mssg) : 
    if e == EErrors.IncorrectUsage : 
     print "Usage : "+mssg 
     elif e == EErrors.FileOpenError : 
     print "Unable to open \"" + mssg + "\" file !" 
    sys.exit(2) 

############################### 
# creates method doxygen header 
def frameDoxygenHeader(param_count, paramList) : 
    commentStr = "/**\n * @brief \n"  
    if param_count > 0 : 
     for param in paramList: 
      commentStr = commentStr + " * @param \n" 

    # comment for return values 
    commentStr = commentStr + " * @return \n */ \n" 

    return commentStr 

############################################## 
# adds the doxygen comments, on method lookup 
def addDoxygenComment(file_name, funcList) : 
    try:  
     fh = open(file_name, 'rb') 
     f_old = open(file_name, 'r+') 
    except: 
       handleException(EErrors.FileOpenError, file_name) 

    f_new = open(out_file_name, "w") 
    final_loc = 0 
    next_split_loc = 0 
    last_write_loc = 0 
    fContent = str(f_old.read()) 
    for func in funcList: 
     SEARCH_TEXT = func 
     print "SEARCH_TEXT "+SEARCH_TEXT 
      fsize = os.path.getsize(file_name) 
      bsize = fsize 
      word_len = len(SEARCH_TEXT) 
     fh.seek(0) 

     # doxygen comment header generation 
     paramListStr = re.findall(r'\(.*\)', SEARCH_TEXT) 
     paramListStr[0] = paramListStr[0].replace('(','') 
     paramListStr[0] = paramListStr[0].replace(')','') 
     paramList = paramListStr[0].split(",") 
     comment_text = frameDoxygenHeader(len(paramList),paramList) 

     while True: 
        found = 0 
        pr = fh.read(bsize) 
        pf = pr.find(SEARCH_TEXT, next_split_loc) 
        if pf > -1: 
          found = 1 
          pos_dec = fh.tell() - (bsize - pf) 
          fh.seek(pos_dec + word_len) 
          bsize = fsize - fh.tell() 
       print "Case-I:"+str(fh.tell()) 
        if fh.tell() < fsize: 
            seek = fh.tell() - word_len + 1 
            print "seek"+str(seek) 
         fh.seek(seek) 
            if 1==found: 
              final_loc = seek 
          next_split_loc = final_loc + word_len - 1 
              print "loc: "+str(final_loc) 
         print "Case-IIa:"+str(fh.tell()) 
        else: 
            break 

     # create file with doxygen comments 
     if final_loc != -1 : 
      #f_new.write(fContent[0:final_loc-1]); 
      #not to miss the contents, between two methods   
      if last_write_loc < final_loc : 
       f_new.write(fContent[last_write_loc:final_loc-1]); 

      f_new.write(comment_text); 
      f_new.write(fContent[final_loc-1:next_split_loc]) 
      last_write_loc = next_split_loc 

      #reset values 
      final_loc = -1 
     else: 
      print "method not found !!" 

    # last of the file should not be missed either 
    if last_write_loc < len(fContent) : 
     f_new.write(fContent[last_write_loc:]); 
    f_new.close() 
    f_old.close() 


############################################# 
############################################# 
# main execution of the code starts from here 
############################################# 
argc = len(sys.argv) 
if (argc == 1 or argc >2) : 
    handleException(EErrors.IncorrectUsage, "genDoxygenC.py <cpp source file>") 
else : 
    # Correct Input as per USAGE. 
    fname = sys.argv[1] 
    out_file_name = fname+'.doxygen' 
    fcontent='' 
    try: 
     # read file 
     fh = open(fname) 
     fcontent = fh.read() 
    # print fcontent 
    except: 
     handleException(EErrors.FileOpenError, fname) 

    # lookup for methods in file 
    funcList = re.findall(RE_M_DECLERATION, fcontent, re.VERBOSE) 
    fh.close() 

    funcListCopy = funcList 
    for fStr in funcListCopy : 
     fStr = fStr.lstrip() 
     startW = fStr.partition(' ')[0] 
     startW = fStr.partition('(')[0] 
     #print startW 
     if startW in cmdList : 
      # invalid method extraction 
      funcList.remove(fStr) 

    # process valid methods-list for doxygen header 
    addDoxygenComment(fname, funcList) 
    #print funcList 

Cách sử dụng :: ./genDoxygenC.py file.h

này sẽ tạo ra

file.h.doxygen

và sau đó, có lẽ bạn có thể kiểm tra doxygen-header-thêm-file, với gốc-header-file sử dụng bất kỳ diff -dụng cụ.

Ví dụ:meld file.h file.h.doxygen

Lưu ý :: Các kịch bản có thể bỏ qua nhà thầu, với các định nghĩa phiên bản mới/tờ khai thích;

S(): n (7)) {};

+0

Bạn có thể tự cung cấp tệp vì sao chép từ đây chỉ làm hỏng mã. – joaopauloribeiro

+1

vui lòng tham khảo mẫu tại https://github.com/parasrish/selfDoxygenH – parasrish

1

Bài đăng cho genDoxygenC.py có nhiều lỗi chỉ mục/khoảng trắng. Vì luồng chương trình Python phụ thuộc vào việc lập chỉ mục thích hợp, tôi lo ngại rằng khối bên trong phương thức thẩm định addDoxygen có thể không đúng. Có cơ hội bạn có thể đăng tệp nguồn thực sự lên đây không?