【发布时间】:2018-09-27 13:43:06
【问题描述】:
注释通常在预处理器运行之前转换为单个空格。但是,有一个引人注目的用例。
#pragma once
#ifdef DOXYGEN
#define DALT(t,f) t
#else
#define DALT(t,f) f
#endif
#define MAP(n,a,d) \
DALT ( COMMENT(| n | a | d |) \
, void* mm_##n = a \
)
/// Memory map table
/// | name | address | description |
/// |------|---------|-------------|
MAP (reg0 , 0 , foo )
MAP (reg1 , 8 , bar )
在本例中,当设置了DOXYGEN 标志时,我想从宏生成 doxygen 标记。如果不是,我想生成变量。在这种情况下,所需的行为是在宏中生成 cmets。有什么想法吗?
我已经尝试过/##/ 和另一个具有更多间接性的示例
#define COMMENT SLASH(/)
#define SLASH(s) /##s
都不行。
【问题讨论】:
-
如果预处理器会生成 cmets,这些在编译前不会被删除。它会失败。
-
Doxygen 不会预处理文件,对吧,所以它不会看到你的宏生成的 cmets。
-
DALT 定义是否正确,看起来像是参数('t' 和 'f')的混合,但可能不是这里的问题。
-
//、/*或*/都不是有效的预处理令牌,因此它们不能由##运算符创建。考虑 3 行源代码:#define CAT(x,y) x##y—CAT(/,/) Comment—CAT(/,*) Comment CAT(*,/)— 预处理器 wittserror: pasting "/" and "/" does not give a valid preprocessing token(其他组合也类似)。如果 Doxygen 不允许这样做——据我所知,它可能不只是运行普通的 C 预处理器(因为这会去掉所有的 cmets)——那么你就被卡住了。考虑一个单独的代码/注释生成阶段。 -
不需要预先运行文档,您可以在 doxygen 中将其作为 INPUT_FILTER 执行(参见 Doxyfile)。
标签: c c-preprocessor doxygen