注释通常在运行前处理器之前转换为单个空格。但是,有一个引人注目的用例。
#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标记。如果不是,我想生成变量。在这种情况下,所需的行为是在宏中生成注释。有什么想法吗?
我尝试了/##/
和另一个具有更多间接性的示例
#define COMMENT SLASH(/)
#define SLASH(s) /##s
都不行。
答案 0 :(得分:4)
在doxygen中,可以在将源输入到doxygen内核中之前在源上运行命令。在Doxyfile中,有一些过滤器的可能性。在这种情况下:INPUT_FILTER
该行应显示为:
INPUT_FILTER = "sed -e 's%^ *MAP *(\([^,]*\),\([^,]*\),\([^)]*\))%/// | \1 | \2 | \3 |%'"
此外,整个#if
构造可能会消失,可能只需要一个:
#define MAP(n,a,d) void* mm_##n = a
答案 1 :(得分:2)
ISO C标准将预处理器的输出描述为预处理令牌的流,而不是文本。注释不是预处理标记。在标记化发生之前,将它们从输入中剥离。因此,在该语言的标准功能范围内,从根本上讲,预处理输出不能包含注释或类似注释的任何内容。
尤其要考虑
#define EMPTY
#define NOT_A_COMMENT_1(text) /EMPTY/EMPTY/ text
#define NOT_A_COMMENT_2(text) / / / text
NOT_A_COMMENT_1(word word word)
NOT_A_COMMENT_2(word word word)
在翻译阶段4之后,以上的第四行和第五行都将成为六标记序列
[/][/][/][word][word][word]
其中方括号指示令牌边界。没有//
令牌这样的东西,因此您无能为力使预处理器产生令牌。
现在,ISO C标准未指定脱氧剂的行为。但是,如果doxygen正在重新使用某人的C编译器随附的预处理器,那么编写该预处理器的人可能会认为,文本预处理器输出首先应该准确反映“适当的编译器”将收到的令牌序列。这意味着它将在必要的地方强行插入空格,以使单独的令牌保持分开。例如,对于上面的示例,test.c
$ gcc -E test.c
...
/ / / word word word
/ / / word word word
(我在我们感兴趣的输出上方消除了一些无关紧要的内容。)
如果有解决办法,您最有可能在doxygen手册中找到它。例如,可能有一些配置选项可以告诉它应该理解某些宏来定义符号,它们是什么符号以及它们应具有的文档。