c - X 宏破坏 doxygen 调用图

标签 c doxygen x-macros

我有 3 个文件:

测试.c

int table[] = {
    #define X(val)    val,
    #include "test.x"
    #undef X
};
void level2(void) {
    level3();
    level4();
}
void level3(void) {
    level4();
}

test2.c

void level1(void) {
    level2();
    level3();
    level4();
}
void level4(void) {
}

测试.x

X(1)
X(2)
X(3)

我使用 doxygen 为这些函数创建调用图。这是我的预期:

  • 1 级:
    • 引用 level2()、level3() 和 level4()。
  • 2级:
    • 引用 level3() 和 level4()。
    • 由 level1() 引用。
  • 3级:
    • 引用 level4()。
    • 由 level1() 和 level2() 引用。
  • 4 级:
    • 由 level1()、level2() 和 level3() 引用。

但这就是我得到的:

  • 1 级:
    • 引用 level2()、level3() 和 level4()。
  • 2级:
    • 由 level1() 引用。
  • 3级:
    • 由 level1() 引用。
  • 4 级:
    • 由 level1() 引用。

看来 test.c 上的 X-macro 是罪魁祸首。我设法让它发挥作用 2 件事(两者都可以):

  1. 重命名test.x,这样 doxygen 就找不到它。它会显示警告,但是 调用图是正确的。
  2. test.x 末尾添加尾随换行符。通常文件会结束 紧接在 X(3) 之后。

问题:

如何在不编辑文件的情况下从 doxygen 中获得可靠的调用图? 是否有我需要更改的设置或者这是一个简单的错误?

最佳答案

我对 xmacros 有不同的经验。一般来说,Doxygen 会将宏视为正确的声明,而不是实际预处理它们。为了让宏工作(这包括 x 宏)。一般来说:

  1. 设置MACRO_EXPANSION=yes
  2. 设置EXPAND_ONLY_PREDEF=yes(这将使 Doxygen 展开所有宏)或
  3. 将宏的名称添加到 EXPAND_AS_DEFINED

此外,请注意:http://www.doxygen.nl/manual/config.html#cfg_skip_function_macros

为了让您了解 xmacros 和 Doxygen 的可能性,我可以从中生成正确的文档:https://github.com/couchbase/libcouchbase/blob/master/include/libcouchbase/error.h#L95

关于c - X 宏破坏 doxygen 调用图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28499422/

相关文章:

C 中的条件运算符

c - 如何从 "C"发送 net-snmp 陷阱

c - C-如何在宏中分配值?

c++ - 创建宏以将 token (参数)一个一个地收集到列表中

c - 自动将 C 源代码翻译成 C89 或 C90

c - 我需要帮助理解这行动态创建数组的代码吗?

perl - 如何使用 Doxygen 和 Doxygen::Filter::Perl 为 Perl 子例程生成文档?

java - Doxygen 注释/属性被忽略

python - 使用 doxygen 记录 Python 包

c++ - 使用 enum 来确定返回结果的类型(使用 Macro 的 hack)