# 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