Xcodeでプリプロセス処理後のソースを見る

どうも、吉村です。

今回は軽いTipsです。
稀に、objecitive-c等でコーディングしている際に、プリプロセス後のソースが見たいケースがあります。
たとえば、マクロに異常がある、等のケースです。
XCodeでは簡単にできるので、やってみると良いと思います。

1、左側のペインで対象のソースを選びます。
2、Productメニュー -> Generate Output -> Preprocessed File を選びます
3、丸裸になったソースをまじまじと見つめます

といった簡単ステップです

これだけではつまらないので、
試しに以下のプログラムを丸裸にしてみましょう

すると、以下のようなプリプロセス後の結果が現れました

・・・予想より長い結果となりました。
さて、ここで面白いことが分かります。
__typeof__(10) __a = (10);
と一度変数に代入しているのが分かります。
なのでちょっと意地悪をしてみます。

これを実行するとなんと、

>出力
{NSLogを一部省略} 0

となってしまいました
これはなぜでしょうか?

また先の方法でマクロを展開してみましょう

問題はこの部分

__typeof__(__a) __a = (__a);

これは

int __a = (__a);

と等価です。 まあこれでは到底正しく実行できるはずがありません。
外側のスコープの__aが内側の__aで見えなくなっているわけです。
ということは__aは未初期化のままということですね。
今回はたまたま0であっただけで、次もそうなる保証はありません。

従って、
「MAXマクロは__aや__bという名前の変数を引数にとれない」
という弱点が明らかになってしまいました。

ちょっと意地悪な例でしたが、まったくこういうことが起こらないとも保証されていないわけですので、
是非このテクニックで切り抜けてください。