2011-10-24 86 views
3

我正在使用C預處理器在枚舉中生成元素。有沒有辦法爲生成的元素編寫doxygen註釋?我不能在doxygen之前通過預處理器運行它,因爲這會剝離doxygen註釋。如何評論生成的代碼

例子:

#define ATTRIBUTES \ 
X(TITLE, "title") \ 
X(FILENAME, "filename") \ 
X(GENRE_ID, "genre_id") 

enum ATTRIBUTES_ENUM { 
    #define X(a, b) a##_ATTRIBUTE, 
    ATTRIBUTES 
    #undef X 
    ATTRIBUTES_COUNT 
}; 

並添加類似:

/** 
* \def TITLE_ATTRIBUTE 
* The media's title. 
*/ 

不起作用。

編輯 感謝托馬斯馬修斯,這裏是我使用的解決方案:

#define ATTRIBUTES \ 
X(TITLE, "title") /*!< title attribute */ \ 
X(FILENAME, "filename") /*!< filename attribute */ \ 
X(GENRE_ID, "genre_id") /*!< genre id attribute */ 

#define X(a, b) a##_ATTRIBUTE, 

enum ATTRIBUTES_ENUM { 
    ATTRIBUTES 
    ATTRIBUTES_COUNT 
}; 

#undef X 

並告訴Doxygen的擴展宏。唯一的缺點是最後一個元素的註釋也被用作ATTRIBUTES定義的註釋。但對我而言這是一個小問題。

+0

您可能會濫用##運算符來生成一個//標記 - 但您會處於未定義行爲的範圍內。問題在於,在擴展宏之前,註釋在翻譯階段3中被刪除。 –

回答

4

請嘗試以下

  1. 在Doxygen的配置文件,告訴它要處理的宏。
  2. 在宏定義,每一個成員後添加的Doxygen註釋:

    #define ATTRIBUTES \ 
    X(TITLE, "title") /**!< title element */ \ 
    X(FILENAME, "filename") /**!< file name element */ \ 
    X(GENRE_ID, "genre_id") /**!< title element */ 
    

由於代碼formmatting問題,在每一行的意見應該是C sytle意見。

我的理解是,Doxygen應該處理宏(進行替換),然後將修改後的文本輸入到它的評論引擎中。

只是一個猜測。

我強烈建議將枚舉轉換爲文本的不同模式。使用數組,矢量或地圖。如:

enum Attributes_Enum 
{ 
    TITLE, FILENAME, GENRE 
}; 

struct Enum_Text_Entry 
{ 
    enum Attributes_Enum value; 
    const char * text; 
}; 

Enum_Text_Entry Enum_To_Text[] = 
{ 
    {TITLE, "title"}, 
    {FILENAME, "filename"}, 
    {GENRE, "genre"}, 
}; 

const unsigned int NUMBER_OF_ENTRIES = 
sizeof(Enum_To_Text)/sizeof(Enum_To_Text[0]); 

現在只需在表格中搜索一個枚舉並將其讀出即可。關於將枚舉值和文本放在一個結構中的好處是,它允許枚舉值發生更改,但其餘代碼不必更改。

+0

不錯,工作!我不得不一直玩弄這一點,並將'#define'移出'enum'定義。在我們的案例中,我認爲這種想法是,通過屬性列表的線性搜索將是不可取的,因爲它最終會處於一個緊密的循環中。這是一個好點 - 使用像這樣的預處理器是有點混亂。 –