コンパイルタイムプログラミング

CPPの #include ディレクティブの引数ってファイル名なんだけど、そのファイルは別にレギュラーファイルでなくてもいいことに気付いた。ファイルシステム上で名前付きのファイルオブジェクトとして扱える(そんでもってちゃんと終端がある)ものならなんでもよいのだ。

というわけで、

#include "/dev/tty"

なんていう、C言語(?)プログラムも可能。

具体的にはこうする

% cat hw.c
#include "/dev/tty"

% cc hw.c
(ここでtty経由の入力待ちになる)

% ./a.out

ttyからの入力待ちになったら、適当なC言語プログラムを入力する。

#include 
int main() { puts("Hello, World!"); }
^D

で、こんにちは世界ができる。(最後に必ず^Dして、ファイルストリームを閉じること)
誤って /dev/zero なんかを渡しちゃうと大変なことになるので注意!!

これを「コンパイルタイムプログラミング」と呼ぼう。

厳密には「プリプロセスタイムプログラミング」なんだけど、C言語においてはプリプロセッシングも広義のコンパイルと考えていいんじゃないかなー、ということで。