2011-10-24 54 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'定义。在我们的案例中,我认为这种想法是,通过属性列表的线性搜索将是不可取的,因为它最终会处于一个紧密的循环中。这是一个好点 - 使用像这样的预处理器是有点混乱。 –