如何通过在C文件中记录#defines来保持doxygen?

时间:2009-11-04 16:40:46

标签: c doxygen c-preprocessor

我在标题中有#define个值,我当然希望Doxygen记录,但我在 C 文件中有其他文件,我将其视为静态常量,我不希望Doxygen记录它们。像

一样简单和愚蠢的东西
#define NUMBER_OF(a) (sizeof((a))/sizeof((a)[0]))
#define MSTR(e) #e

如何让Doxygen不将这些#define放入它创建的文档中?我尝试用@internal标记它,但这似乎没有帮助。

关于Doxygen和#define的一个有点相关的问题,我怎么能得到:

#define SOME_CONSTANT 1234 /**< An explanation */

在输出中输入“SOME_CONSTANT”和“An explain”而不是“1234”?

7 个答案:

答案 0 :(得分:9)

无需使用\cond\endcond命令。您只需使用\hideinitializer命令即可​​隐藏初始化程序:

#define SOME_CONSTANT 1234 /**< An explanation @hideinitializer */

关于第一个问题,您可以设置HIDE_UNDOC_MEMBERS = YES,只有具有Doxygen文档块的宏将显示在输出中。

答案 1 :(得分:4)

您可以在doxyfile中设置MAX_INITIALIZER_LINES = 0以隐藏定义的值。

答案 2 :(得分:3)

您可以使用\cond ... \endcond标记从Doxygen解析中排除代码的任何部分。

编辑:一些相关问题:

答案 3 :(得分:1)

毫无疑问,它仍然会显得嘈杂和不自然,但要解决您的其他问题,请尝试:

/** An explanation */
#define SOME_CONSTANT /** @cond */ 1234 /** @endcond */

答案 4 :(得分:1)

您只想记录.h文件中声明的内容。我假设您在static文件中将所有静态函数和变量声明为.c。所有剩余的都在.h相应的文件中声明。这些是您的“公共”成员。

在这种情况下我喜欢做什么,而且我相信doxygen更适合用这种方式:

    在您的Doxyfile
  • ,设置EXTRACT_ALL = NO并将.h文件所在的目录添加到INPUT
  • /** \file */添加到您的所有.h个文件中(但不包括.c个文件)。

这将仅索引.h个文件中包含的内容。您仍然可以在.cINPUT文件的目录添加到Doxyfile,然后会扫描这些文件以获取“公共”成员的其他文档......

答案 5 :(得分:0)

我通过将文档从.c文件移动到.h文件解决了这个问题。然后只在.h文件上运行doxygen。

然后我想要记录的项目(&#39;公共&#39;项目)本质上是doxygen选择的。

因为我以前一直小心翼翼地把公众&#39; .h文件中的项目和私有&#39; .c文件中的项目非常有效。

当我注意到doxygen正在拉入包含时,我想到了这种技术。让我感到震惊的是,如果我还要移动调用模块需要使用我的模块的包含子集,那么该列表也将被记录。

此技术还有一个额外的好处:我可以在更新文档时将文档放在一个终端窗口中,将源放在不同的终端窗口中。

答案 6 :(得分:0)

有时候,您可能有一个要记录的定义,但是想要doxygen对其进行不同的处理(甚至完全忽略它,以避免解析错误)。 为此,您可以在Doxygen中定义#define,与在源代码中定义不同。

示例: 一些编译器允许变量链接到特定段,即:

const int myvar @ "segment_of_myvar_in_memory"=123;

=> doxygen将解析“ segment_of_myvar_in_memory”部分作为不需要的变量名。 我们可以为其使用定义:

#define __link_to_segment(name) @ name
const int myvar __link_to_segment("segment_of_myvar_in_memory")=123;

如果“预处理”处于活动状态,则Doxygen现在将我们的变量解释为一个函数,因为类似于函数的定义都使用方括号。 但是,如果我们在Doxyfile中重新定义定义,则行为会改变:

PREDEFINED = __link_to_segment(a)=

现在变量已正确解析为变量-前面的所有类型或关键字也正确显示为关键字。

一个不错的侧面效果: 如果您在代码中使用2个不同的IDE(一个用于编译和调试的IDE,一个用于编辑的IDE),您还会发现某些IDE(即Eclipse)在解析带有@“ segment name”的变量时遇到问题。使用上述方法,您也可以在那里重新定义__link_to_segment(name):

#define __link_to_segment(name)

即然后,Eclipse将正确显示并解析该变量,而“编译和调试” IDE仍可以将变量链接到其段名。