Doxygen とプリプロセッサ

上の話題に関連して、 C/C++ プリプロセッサRuby で実装した人がいないか探していたら、こんなページを発見。

クラスのメンバメソッドをマクロで宣言すると、 Doxygen なんかで展開したときに解析されなくて Bad だよねー、という話。そうそう。うちにもそういうクラスがあるんです。しかもたくさん。
このページのコメントによると、 doxyfile で EXPAND_AS_DEFINED を設定しておくとよいとか。
というわけで自前の doxyfile を眺めてみると、確かにそれらしい設定があります。眺めてみた限りだと、

# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then
# this tag can be used to specify a list of macro names that should be expanded.
# The macro definition that is found in the sources will be used.
# Use the PREDEFINED tag if you want to use a different macro definition.

どうやら MACRO_EXPANSION を YES にしろと言っているようです。というわけで、こんなダミープログラムを書いて実験してみました。
サンプルコード

#include <stdio.h>

#define DECL_METHOD \
    void test()  { puts("test");  } \
    void test2() { puts("test2"); }

class Test {
public :
    DECL_METHOD
};

class Test2 : public Test {};
class Test3 : public Test {};

void main() {
    Test2 t2;
    t2.test();
    t2.test2();

    Test3 t3;
    t3.test();
    t3.test2();
}

このあと doxygen -g test.doxyfile で設定ファイルを生成して、

MACRO_EXPANSION = YES
HAVE_DOT = YES
UML_LOOK = YES

として実行。(クラス図を生成)
結果

確かにマクロ展開後のソースで解析してくれているようです。