ひがきの日記

2009-02-10

プリプロセッサのための #

あるコードを見ていたら、こんなのが出てきた。

#if defined(XERCES_NO_NATIVE_BOOL)
  #ifndef bool
    typedef int     bool;
  #endif
  #ifndef true
    #define  true     1
  #endif
  #ifndef false
    #define false     0
  #endif
#endif

きしょくわる〜
# って 1 桁目じゃなくてもいいの?
知らんかった。

今まで、こういうときは、こんな風に書いてた。

#if defined(XERCES_NO_NATIVE_BOOL)
#  ifndef bool
    typedef int     bool;
#  endif
#  ifndef true
#    define  true     1
#  endif
#  ifndef false
#    define false     0
#  endif
#endif

どっちの方が、きしょくわるい?

2008-12-24

関数のポインタの配列

度忘れした。
恥ずかしい。
最近は C++ ばかりやってたから …… と言い訳しておく。

int (*f)(int);  /* int の引数を持つ int を返す関数のポインタ */
int (*f[])(int);  /* その配列 */
const char* (*f[])(void);  /* const char* を返す関数のポインタの配列 */
char* (* const f[])(void);  /* char* を返す関数のポインタの配列を const に */

2008-07-04

C 言語でクロージャ?

昼休みに職場の先輩に Ruby/Rails 勉強会で聞いた関数型言語の話をちょこっと報告。

先輩は、ここ 20 〜 30 年は静的型付言語ばかり使っていて、クロージャの話をしたところ「コンパイラはどんなコード吐くの?」と興味津々。
いや、私に聞かれても (^_^;;

それから数時間後、こんなコードが送られてきました。

# include <stdio.h>

static void shunin(double kyuryo(double), double bonus(double))
{
    static const double ratio = 2;

    printf("主任がすばやく立ちました。\n");
    printf("給料は %g 円です。\n", kyuryo(ratio));
    printf("ボーナスは %g 円です。\n", bonus(ratio));
}

int main()
{
    double kihonkyu;

    static double kyuryo(double ratio)
    {
	return kihonkyu * ratio;
    }

    static double bonus(double ratio)
    {
	return kyuryo(ratio) * 4;
    }

    kihonkyu = 100;
    shunin(kyuryo, bonus);

    return 0;
}

これってクロージャ?