0

我有 3 个文件:

测试.c

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

测试2.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 是罪魁祸首。我设法通过做两件事来使它工作(要么会做):

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

问题:

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

4

1 回答 1

1

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

  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

于 2015-02-13T13:32:39.577 回答