X-macro打破了doxygen callgraph

我有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()。
  • level2的:
    • 引用level3()和level4()。
    • 由level1()引用。
  • 3级:
    • 参考文献level4()。
    • 由level1()和level2()引用。
  • 级别4:
    • 由level1(),level2()和level3()引用。

但这是我得到的:

  • 1级:
    • 引用level2(),level3()和level4()。
  • level2的:
    • 由level1()引用。
  • 3级:
    • 由level1()引用。
  • 级别4:
    • 由level1()引用。

看来test.c上的X-macro是罪魁祸首。 我设法通过做两件事来做到这一点(要么会做):

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

题:

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

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

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

另外,请注意: http : //www.stack.nl/~dimitri/doxygen/manual/config.html#cfg_skip_function_macros

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