1. 程式人生 > >doxygen 使用簡介(C,C++為程式碼作註釋)

doxygen 使用簡介(C,C++為程式碼作註釋)

doxygen註釋塊

doxygen註釋塊其實就是在C"C++註釋塊的基礎新增一些額外標識使doxygen把它識別出來並將它組織到生成的文件中去。

在每個程式碼項中都可以有兩類描述這兩類描述將在文件中格式化在一起一種就是brief描述另一種就是detailed 兩種都是可選的,但不能同時沒有。

顧名思義簡述(brief)就是在一行內簡述地描述。而詳細描述(detailed description)則提供更長更詳細的文件。

doxygen有多種方法將註釋塊標識成詳細描述:

1. 你可以使用JavaDoc風格即在C風格註釋塊開始使用兩個星號'*', 

就像這樣:

2. /**
3.  * ... 描述 ...
4.  */

5. 或者你使用Qt風格程式碼註釋即在C風格註釋塊開始處新增一個歎號'!':

6. /*!
7.  * ... 描述 ...
8.  */

註釋塊中間的星號是可選所以將註釋塊寫成:

/*!
 ... 描述 ...
*/

同樣也是有效的.

9. 第三種方法就是使用連續兩個以上C++註釋行所組成的註釋塊而每個註釋行開始處要多寫一個斜槓或寫一個歎號。像下行這樣:

10.///
11./// ... 描述 ...
12.///

或者

//!
//!... 描述 ...
//!

13. 一些人喜歡使他們的註釋塊在文件中顯得更為顯目

所以你也可以這麼做:

14./////////////////////////////////////////////////
15./// ... 描述 ...
16./////////////////////////////////////////////////

簡述同樣也可以同種寫法:

1. 一種是在一個doxygen註釋塊中使用這個命令只對當前一個文欄位有效所以詳細描述應該與之間隔一個空行.

像這樣:

/*! "brief 這裡是簡要描述.
 *         這裡仍然是簡要描述.
 *
詳細描述從這裡開始.
 */

2. 如果在doxygen配置檔案將設定成YES。則JavaDoc風格將註釋塊中的第一個句子視為簡要描述這個句子可以以句號'.'、空格或者空行來結束:

3. /** 這裡是簡述, 並由句號結束. 詳細描述從這裡
4.  * 開始.
5. 
 */

這個功能同樣多行C++行註釋段中有效:

/// 這裡是簡述, 並由句號結束. 詳細描述從這裡
/// 開始..

6. 第三種方法就是詳細描述註釋段緊跟在一行C++註釋段後面至多隔一個空行如下面兩個例子:

7. /// 簡述.
8. /** 詳細描述. */

或者

//! 簡述.
//! 詳細描述
//! 從這裡開始.

注意最後一個例子例子那個空行是用來分隔簡述註釋段和詳細描述段的不能去掉.而且JAVADOC_AUTOBRIEF不應該被設定成YES.

看上去doxygen是相當富有彈性但下面的例子是非法的:

//! 這個簡述因為是多行的
//! 會被認為是詳細描述..
/*! 而這裡則是另外的詳細描述.
 */

因為doxygen只允許一個簡要和一個詳細描述。

此外如果在一個程式碼項的宣告之前有簡要描述而且在其定義之前也有簡要描述那麼doxygen只使用宣告之前的描述。而如果詳細描述出現了同樣的情況, doxygen則會使用定義之前的描述另外的描述會被忽略掉。

這裡有一個使用Qt風格的C++程式碼:

//! A test class. 
/*!
 A more elaborate class description.
*/
class Test
{
 public:
    //! An enum.
    /*! More detailed enum description. */
    enum TEnum { 
                 TVal1, /*!< Enum value TVal1. */ 
                 TVal2, /*!< Enum value TVal2. */ 
                 TVal3 /*!< Enum value TVal3. */ 
               } 
         //! Enum pointer.
         /*! Details. */
         *enumPtr, 
         //! Enum variable.
         /*! Details. */
         enumVar; 
    //! A constructor.
    /*!
      A more elaborate description of the constructor.
    */
    Test();
    //! A destructor.
    /*!
      A more elaborate description of the destructor.
    */
   ~Test();
    //! A normal member taking two arguments and returning an integer value.
    /*!
      "param a an integer argument.
      "param s a constant character pointer.
      "return The test results
      "sa Test(), ~Test(), testMeToo() and publicVar()
    */
    int testMe(int a,const char *s);
    //! A pure virtual member.
    /*!
      "sa testMe()
      "param c1 the first argument.
      "param c2 the second argument.
    */
    virtual void testMeToo(char c1,char c2) = 0;
    //! A public variable.
    /*!
      Details.
    */
    int publicVar;
    //! A function variable.
    /*!
      Details.
    */
    int (*handler)(int a,int b);
};

點選這裡檢視doxygen產生的HTML文件.

只有一行的註釋段包含的是簡述而多行的註釋段則包含的是詳細描述.

簡要描述可以被用來進行classnamespace或者檔案的成員描述被以較小的斜體字型顯示出來。(這種描述可以通過將設定成NO來隱藏。)預設情況下,簡要描述會被顯示成詳細描述的第一個句子。(這同樣可以通過將設定成NO來遮蔽。)Qt風格中兩種描述都是可選的。

預設情況下, JavaDoc風格的註釋段和Qt風格的註釋段的行為是相同的。但這樣就不符合JavaDoc標準註釋段的第一個句應該自動識別為簡要描述。你應該設定 來啟用這個功能。如果你設定了這個選項並想在句子中間放置一個句號你應該在後面新增一個反斜槓和一個空格就像下面的例子一樣:

 /** Brief description (e.g." using only a few words). Details follow. */

Here is the same piece of code as shown above, this time documented using the JavaDoc style and JAVADOC_AUTOBRIEF set to YES:

/**
 * A test class. A more elaborate class description.
 */
class Test
{
 public:
    /** 
     * An enum.
     * More detailed enum description.
     */
    enum TEnum { 
          TVal1, /**< enum value TVal1. */ 
          TVal2, /**< enum value TVal2. */ 
          TVal3 /**< enum value TVal3. */ 
         } 
       *enumPtr, /**< enum pointer. Details. */
       enumVar; /**< enum variable. Details. */
      /**
       * A constructor.
       * A more elaborate description of the constructor.
       */
      Test();
      /**
       * A destructor.
       * A more elaborate description of the destructor.
       */
     ~Test();
      /**
       * a normal member taking two arguments and returning an integer value.
       * @param a an integer argument.
       * @param s a constant character pointer.
       * @see Test()
       * @see ~Test()
       * @see testMeToo()
       * @see publicVar()
       * @return The test results
       */
       int testMe(int a,const char *s);
      /**
       * A pure virtual member.
       * @see testMe()
       * @param c1 the first argument.
       * @param c2 the second argument.
       */
       virtual void testMeToo(char c1,char c2) = 0;
      /** 
       * a public variable.
       * Details.
       */
       int publicVar;
      /**
       * a function variable.
       * Details.
       */
       int (*handler)(int a,int b);
};

點選這裡檢視doxygen產生的HTML文件.

不像其它的文件系統 , doxygen允許在程式碼項的定義之前面放置成員(包括全域性函式)的註釋。這種方法可以在原始檔中進行文件註釋工作。這就是使得標頭檔案可以比較簡潔使程式碼的實現人員更容易閱讀。比較折中的方案就是在宣告的地方新增簡要描述在實現的地方新增詳細描述。

在成員後面放置文件

如果你想對檔案、結構體、聯合體、類或者列舉的成員進行文件註釋的話並且要在成員中間添加註釋而這些註釋往往都是在每個成員後面。為此你可以使用在註釋段中使用'<'標識

Here are some examples:

int var; /*!< Detailed description after the member */

This block can be used to put a Qt style detailed documentation block after a member. Other ways to do the same are:

int var; /**< Detailed description after the member */

或者

int var; //!< Detailed description after the member
         //! 

或者

int var; ///< Detailed description after the member
         /// 

Most often one only wants to put a brief description after a member. This is done as follows:

int var; //!< Brief description after the member

或者

int var; ///< Brief description after the member

Note that these blocks have the same structure and meaning as the special comment blocks in the previous section only the < indicates that the member is located in front of the block instead of after the block.

Here is an example of the use of these comment blocks:

/*! A test class */
class Test
{
 public:
    /** An enum type. 
     * The documentation block cannot be put after the enum! 
     */
    enum EnumType
    {
      int EVal1,     /**< enum value 1 */
      int EVal2      /**< enum value 2 */
    };
    void member();   //!< a member function.
  protected:
    int value;       /*!< an integer value */
};

點選這裡檢視doxygen產生的HTML文件.

警告:

這種註釋方法只能在成員引數中使用。它們不能用在描述檔案、類、聯合體、名字空間和列舉本身。此外在下一節提到的結構化命令("class)在這種註釋段中是無效的。

在其它地方進行註釋

雖然我們一般是在宣告和定義的前面新增文件註釋塊但也許出於某種情況需要將文件放在其它什麼位置上。比如我們需要編寫一段實際上不存在的檔案的描述。因此, Doxygen允許將文件放置在任何位置。(除了在函式體內或在一個普通的註釋段)

為了達到這種目的你唯一要做的就是在註釋段中使用結構化命令。

結構化命令(就像其它命令)由一個反斜槓("),  JavaDoc風格中使用的@來做開頭後面緊跟著命令名字和一些引數。例如你想註釋一個名為Test的類如下例:

/*! "class Test
    "brief A test class.
    A more detailed class description.
*/

命令"class被用來指示程式碼段中包含著關於Test類的文件.其它的結構化命令有:

·"struct 生成 C結構的文件.

·"union 生成聯合體的文件.

·"enum 生成列舉的文件.

·"fn 生成函式的文件.

·"var生成變數或typedef或列舉值的文件.

·"def 生成#define定義的文件.

·"file 生成關於一個檔案的文件.

·"namespace 生成名字空間的文件.

·"package 

相關推薦

doxygen 使用簡介C,C++程式碼註釋

doxygen註釋塊 doxygen註釋塊其實就是在C"C++註釋塊的基礎新增一些額外標識, 使doxygen把它識別出來, 並將它組織到生成的文件中去。 在每個程式碼項中都可以有兩類描述, 這兩類描述將在文件中格式化在一起: 一種就是brief描述, 另一種就是de

二叉樹的鏈式儲存結構及實現C語言完整程式碼+詳細註釋

鏈式儲存結構儲存二叉樹,實際上就是採用連結串列儲存二叉樹。 既然是使用連結串列,首先需要構建連結串列中節點的結構。考慮到儲存物件為二叉樹,其各個節點最多包含 3 部分,依次是:左孩子、節點資料和右孩子,因此,連結串列的每個節點都由這 3 部分組成: 圖 1 二叉連結串列結點構成 圖 1 中,Lchi

Python 基礎爬蟲簡介測試環境 Python 2.7

1、什麼是爬蟲? 爬蟲是一種自動訪問網際網路,並提取資料的一個程式。歸根結底,所謂爬蟲,不過是我們用Python語言編寫的一個小程式而已。 針對的問題:有些網頁需要我們登陸後才能訪問,而有些網頁則不需要。動態登陸頁面由Ajax非同步載入實現,往往針對此類頁面的

Swift 與 Object-C 互動 Swift版本:1.2

這篇文章主要是介紹 Swift 與 Object-C 之間進行互動的程式碼,主要分為兩個部分。一個是 Swift 專案呼叫 Object-C 的類,另一個是 Object-C 專案呼叫 Swift 類。過程是很簡單,但是對於沒接觸過的人來說,還是存在一點難度的。 你可以在 GitHub 上下載此文章相關

連結串列的插入和刪除操作詳解C語言實現+詳解註釋

連結串列的基本操作中,連結串列結點的插入和刪除相對比較複雜,需根據結點插入位置的不同,使用合理的方法在不破壞原連結串列結構的前提下將其插入到連結串列中。 本節將詳解介紹這兩種操作的具體實現方法,讀者只需牢記實現步驟,即可輕鬆解決這兩大難點。 連結串列中插入結點 連結串列中插入結點,根據插入位置的不同,可

jQuery 插件 Magnify 開發簡介仿 Windows 照片查看器

使用方法 htm git 縮放 -c 限制 演示 body 所有 前言 因為一些特殊的業務需求,經過一個多月的蟄伏及思考,我開發了這款 jQuery 圖片查看器插件 Magnify,它實現了 Windows 照片查看器的所有功能,比如模態窗的拖拽、調整大小、最大化,圖片的

httpclient之post 方法參數Map類型

直接 close 設置 map .config pre 配置 amr public package httpclient;import java.io.BufferedReader;import java.io.IOException;import java.io.Inpu

Android第一行程式碼實驗一活動的最佳實踐

活動的最佳實踐    1.知曉當前是在哪一個活動         這個技巧將教會你,如何根據程式當前的介面就能判斷出這是哪一個活動。  首先需要新建一個 BaseActivity 繼承自

設計模式1——簡介翻譯自維基百科wiki

說明(Tips) 翻譯維基百科對於設計模式的相關描述。後續會有對23中設計模式的實踐。 表格內容處正在更新中(暫時只更新23個設計模式內容) 此文章主要內容: 設計模式發展歷史 設計模式學習的價值所在 書籍推薦。在“發展歷史(History)”章節

Hive效能優化簡介 順便介紹了效能工具--ANALYZE

ANALYZE關鍵字可以收集數值統計資訊。 加速查詢,直接從統計資訊中拿,而不會再啟動mapreduce去查詢。 用desc命令去查統計資訊。     Hive效能優化包含以下點: partition table 這是最好的優化,比如用年月日,部門

SelectSearch+CNN人工智慧實現人臉檢測和識別圖文教程附完整專案程式碼python語言

未完待續。。。 本文只說明原理,提供參考,實際應用需考慮其他因素。 環境 win7 python3.6.3 keras2.1.4 注意:各軟體之間版本之間存在適配問題。 目標 通過人工智慧技術實現目標(人臉)檢測和識別 步驟 1.selectsearc

《機器學習實戰》第2章閱讀筆記3 使用K近鄰演算法改進約會網站的配對效果—分步驟詳細講解1——資料準備:從文字檔案中解析資料附詳細程式碼註釋

 本篇使用的資料存放在文字檔案datingTestSet2.txt中,每個樣本資料佔據一行,總共有1000行。 樣本主要包含以下3中特徵: (1)每年獲得飛行常客里程數 (2)玩視訊遊戲所耗時間百分比 (3)每週消費的冰淇淋公升數 在使用分類器之前,需要將處理的檔案格式

《機器學習實戰》第2章閱讀筆記2 K近鄰演算法實現附詳細程式碼註釋

虛擬碼如下: 對未知類別屬性的資料集中的每個點一次執行以下操作: (1)計算已知類別資料集中的點與當前點之間的距離; (2)按照距離遞增次序排序; (3)選取與當前點距離最小的k個點; (4)確定前k個點所在類別出現的頻率 (5)返回前k個點出現頻率最高的類

ubuntu14.04,配置GOPATHGO語言開發程式碼存放目錄

一,建立GOPATH:選擇一個目錄或者在我們想要的地方建立一個作為GOPATH的目錄,我的GOPATH是:“/home/sunylat/gopath”。 二,配置系統變數:在shell裡面輸入“sudo gedit /etc/environment”,在開啟的檔案末尾加入:

矩陣相加的演算法儲存結構三元組表

假設稀疏矩陣A和B均以三元組表作為儲存結構。試寫出矩陣相加的演算法,另設三元組表C存放結果矩陣。 稀疏矩陣的三元組順序表型別TSMatrix的定義: #define MAXSIZE 20 // 非零元個數的最大值 typedef struct { int i,j;

佇列——順序儲存的迴圈佇列儲存元素自定義型別

相比儲存預設型別的迴圈佇列,首先我們需要自定義儲存的類。 自定義顧客類(Customer.h) #pragma once #include<string> using names

android執行緒實現:實時顯示所連線的wifi訊號強度程式碼註釋

首先:AndroidManifest.xml檔案中加一行:獲取許可權 <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/> layout.xml檔案中的程式碼: <Li

torch7 安裝 並安裝 hdf5模組 torch模組 nn模組 系統平臺 ubuntu18.04 版本

今年的CCF A會又要開始投稿了,實驗室的師弟還在玩命的加實驗,雖然我屬於特殊情況是該從靠邊站被老闆扶正但是實驗室的事情我也盡力的去幫助大家,所以師弟在做實驗的時候遇到了問題也會來問問我,這次遇到的一個問題就是torch7的安裝,以及 hdf5模組,torch模組 , nn模組的安裝 搞不上,於是乎我就再次出

Python3《機器學習實戰》01:k-近鄰演算法完整程式碼註釋

執行平臺: Windows Python版本: Python3 IDE: Anaconda3 # -*- coding: utf-8 -*- """ Created on Sun Apr 29 20:32:03 2018 @author: Wang

關於執行緒同步的問題方法同步和程式碼塊同步

package com.bootdo.wang; /** * 執行緒同步: * 1.方法同步 * 2.程式碼塊同步 */ public class ThreadSynchronization { class Bank { private int account