2008-10-14 [長年日記]

_ [Life] 今日の三行

9時半起床。出勤時、隣に古事記を読む女性。仕事、何となく全体像が見えてき

た。一歩進んで立ち往生。出産の事務手続きを忘却。明日やる。物件探し。吟

味するも最終的な判断は Y ちゃん。tkd さんとなか卯。牛丼。Flash9動作確認。

_ [C] 返り値を返すマクロ関数の作成

gcc 限定。

本来あまり推奨されない事だけど、マクロで返り値を返してほしい時。

以下のように記述する。

 書式
#define MACRO(args) ({    \
        command statments; \
        return_value;     \
        })

_ ステートを "({})" で囲むとステート(文)ではなく、"return_value" を返す式とみなされる。つまり、返り値はステートの最後に記述する必要が有り。

以下、引数 num に 10 と 20 を加算するサンプルマクロ HOGE。

 サンプルマクロ HOGE
#define HOGE(num)                               \
    ({  int a;                                  \
        int b;                                  \
        a = num + 10;                           \
        b = a + 20;                             \
        b;})
printf("%d\n", HOGE(10));
=> 40

_ 詳細は gcc の info の 3.10.4 Duplication of Side Effects を参照。なお "({})" は gcc の独自拡張なので、gcc 以外のコンパイラではコンパイルエラーになります。

余談。上記 info の min() のサンプルで使用されている typeof 演算子(変数の型を返す)も gcc の独自拡張です。

本日のTrackBacks(全1件) []
_ ネイル:脇山サロン (2008-11-09 23:48)

人気の脇山サロン案内


«前の日記(2008-09-30) 最新 次の日記(2008-11-01)»