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言語ではないけれど,それでも重要な要素には変わりないわけで……(以下略)