define 値の展開について

doxygen の PREDEFINED 設定について詳しく説明します。

1 PREDEFINED とは

PREDEFINED は、doxygen の前処理段階で事前に定義されるマクロを指定する設定項目です。これにより、条件付きコンパイル (#ifdef#if など) の評価を制御できます。

2 設定方法

2.1 設定ファイル (Doxyfile) での記述

PREDEFINED = MACRO1 \
             MACRO2=value \
             MACRO3="string value" \
             DEBUG \
             PLATFORM_LINUX

3 使用例

3.1 単純なマクロ定義

PREDEFINED = DEBUG

これは以下と同等:

#define DEBUG

3.2 値付きマクロ定義

PREDEFINED = VERSION=2 \
             MAX_SIZE=1024

これは以下と同等:

#define VERSION 2
#define MAX_SIZE 1024

3.3 文字列値マクロ

PREDEFINED = COMPILER="GCC" \
             PLATFORM="Linux"

3.4 複数条件の定義

PREDEFINED = FEATURE_A \
             FEATURE_B \
             HAVE_OPENSSL \
             _WIN32 \
             __cplusplus

4 実際のコード例

4.1 ソースコード

/**
 * @brief 計算関数
 */
class Calculator {
public:
    int add(int a, int b);
    
#ifdef ADVANCED_FEATURES
    /**
     * @brief 高度な計算機能
     */
    double advanced_calc(double x, double y);
#endif

#ifdef DEBUG
    /**
     * @brief デバッグ用関数
     */
    void debug_print();
#endif

#if VERSION >= 2
    /**
     * @brief バージョン2 以降の機能
     */
    void new_feature();
#endif
};

4.2 設定例: すべての機能を文書化

PREDEFINED = ADVANCED_FEATURES \
             DEBUG \
             VERSION=2

4.3 設定例: 本番環境向け文書化

PREDEFINED = ADVANCED_FEATURES \
             VERSION=2

4.4 設定例: デバッグ版文書化

PREDEFINED = DEBUG \
             VERSION=1

5 よく使用されるマクロ

5.1 プラットフォーム固有

PREDEFINED = _WIN32 \
             __linux__ \
             __APPLE__ \
             __cplusplus

5.2 コンパイラ固有

PREDEFINED = __GNUC__ \
             _MSC_VER \
             __clang__

5.3 一般的な機能フラグ

PREDEFINED = HAVE_OPENSSL \
             ENABLE_THREADING \
             USE_BOOST \
             NDEBUG

6 高度な使用法

6.1 条件付きマクロ展開

PREDEFINED = DOXYGEN_SHOULD_SKIP_THIS= \
             API_EXPORT= \
             DEPRECATED=

6.2 関数修飾子の除去

// ソースコード
API_EXPORT DEPRECATED int old_function();
PREDEFINED = API_EXPORT= \
             DEPRECATED=

結果: int old_function(); として文書化

6.3 プラットフォーム別 API

#ifdef _WIN32
    HANDLE create_file(const char* name);
#else
    int create_file(const char* name);
#endif
PREDEFINED = _WIN32

または

PREDEFINED = __linux__

7 注意点とベストプラクティス

7.1 長い行の分割

PREDEFINED = MACRO1 \
             MACRO2 \
             MACRO3

7.2 特殊文字のエスケープ

PREDEFINED = STRING_MACRO="\"Hello World\""

7.3 空値の定義

PREDEFINED = EMPTY_MACRO=

7.4 条件の組み合わせ

PREDEFINED = FEATURE_A \
             FEATURE_B \
             COMBINED_FEATURES

8 トラブルシューティング

8.1 よくある問題

  1. マクロが認識されない
    • ENABLE_PREPROCESSING = YES を確認
    • マクロ名のスペルチェック
  2. 値が正しく設定されない
    • 引用符の使用を確認
    • エスケープ文字の確認
  3. 複雑な条件が評価されない
    • ENABLE_PREPROCESSING = NO を検討
    • より単純な条件に分割

8.2 デバッグ方法

doxygen -d Preprocessor