IOCCCコード解析その5

なんか適当に選んでいるんですよね。解析するコード。基本的にごちゃごちゃしたのはやめようかなと、あと、長いのもダメってことにしている。少しは勉強になればいいな〜
・1988年「Best abuse of the rules」受賞作品(spinellis.c)
中身はこんなかんじ〜

#include "/dev/tty"
いや〜なんじゃこりゃ〜って感じですよね。ちなみに、ttyってテレタイプ(teletype ?)の略だそうだ。これだけではわからないのでMakefileを見てみる。
spinellis: spinellis.c spinellis.data
@echo This program can not be portably compiled with a makefile
@echo because it reads from /dev/tty.
@echo Compile this program with: cc spinellis.c -o spinellis
@echo and type the following text followed by an EOF '(^D)'.
@cat spinellis.data
@-if [ ! -f spinellis ]; then \
touch spinellis; \
fi
英語が読めないのは痛いがヒント等参考にしながら勘でやってみる。
$ cc spinellis.c -o spinellis
コンパイルしようとすると何か入力を求められるんだよね。そこで、spinellis.data ってファイルが付属していたので、その中身を入力してみる。
main()
{
printf("Hello world\n");
}
その後、Makefileやヒントにも記述してあったように、Ctl+Dで中断。そうすると実行ファイル spinellis が完成しているのよ。実際にそのファイルを実行してみると画面に「Hello world」と表示されるのだ。つまり何か〜「#include」ってのはマクロだよね。これはプリプロセスの段階で展開されるから、その展開の情報を「/dev/tty」から取得しているって事ですか、へ〜だね。
ちなみにプリプロセス段階で作成されるコード
# 1 "spinellis.c"
# 1 ""
# 1 ""
# 1 "spinellis.c"
# 1 "/dev/tty" 1
main()
{
printf ("Hello world\n");
}
# 1 "spinellis.c" 2
プリプロセス終了後、上記コードをコンパイルしたって事ですよね。ふ〜ん、これはナイスアイデアなのかな〜まあ面白いが私がコーディングするのかよ!と思った。なるほどね〜
では!