2006-12 << 2007-01 >> 2007-02

2007-01-03 (水)

*プリプロセッサ

下のCで書かれたプログラムの出力はどうなるでしょうか?

#define VAR(t) v_##t
#define A x
int main(){
    int v_A=0,v_x=0;
    VAR(A)=1;
    printf("%d %d\n",v_A,v_x);
    return 0;
}

「0 1」の出力を期待して書いていたのだけど,「1 0」と出力されます.マクロが外側から展開されるのを忘れていました.VAR(A)がv_Aになった時点で,Aをxに置き換えできないわけですね.

#define _VAR(t) v_##t
#define VAR(t) _VAR(t)
#define A x
int main(){
    int v_A=0,v_x=0;
    VAR(A)=1;
    printf("%d %d\n",v_A,v_x);
    return 0;
}

このように書けば意図したとおりに動くようです.しかし,正直,プリプロセッサの仕様を確認してないので,常に使えるのかどうかわかりません.

そういえば,C言語の入門書ってプリプロセッサおざなりな気が.まぁ,確かにプリプロセッサはC言語ではないけれど,それでも重要な要素には変わりないわけで……(以下略)