X-macro打破了doxygen callgraph

时间:2015-02-13 12:14:52

标签: c doxygen x-macros

我有3个文件:

test.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) {
}

test.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找不到它。它会显示警告,但是     callgraph是正确的。
  2. test.x末尾添加尾随换行符。通常文件会结束     在X(3)之后立即。
  3. 问题:

    如何在不编辑文件的情况下从doxygen中获取可靠的调用图? 我需要改变一个设置还是这个普通的错误?

1 个答案:

答案 0 :(得分:1)

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

  1. 设置MACRO_EXPANSION=yes
  2. 设置EXPAND_ONLY_PREDEF=yes(这将使Doxygen扩展所有宏)或
  3. 将您的宏名称添加到EXPAND_AS_DEFINED
  4. 此外,请注意: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