扩展注释的注释(对于doxygen)

时间:2018-09-27 13:43:07

标签: c c-preprocessor doxygen

注释通常在运行前处理器之前转换为单个空格。但是,有一个引人注目的用例。

#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

都不行。

2 个答案:

答案 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手册中找到它。例如,可能有一些配置选项可以告诉它应该理解某些宏来定义符号,它们是什么符号以及它们应具有的文档。