C言語で、ちょっとした書き捨てのプログラムを書くとき、毎回毎回、コンパイル実行のコマンドを打つのは面倒だと思っていました。
LL言語みたいにシェルバングで実行できると良いなあと思いました。
Webでググってみると、それを実現するシステムはあるのですが、使用しているマシン全部にそれをインストールして保守するのも面倒くさいと思います。
そこで、Linuxとか限定ですが、プログラムの頭に二行入れることで解決することを思いつきました。
例えばこうするのです。
prime_c.sh
|C|
!/bin/sh
t=
mktemp
;tail -n +3 $0 | gcc -x c - -o $t; $t; rm $t; exitinclude <stdio.h>
include <string.h>
/ MAX_N までの素数を表示 /
define MAX_N 100
int main( int ac, char *av[]) { int flgs[MAX_N]; int n,i;
memset( flgs, 0, sizeof( flgs));
n = 2;
while( n < MAX_N){
if( !flgs[n]){
printf( "%d\n", n);
for( i=n; i<MAX_N; i+=n){
flgs[i] = 1;
}
}
n++;
}
return 0;
} ||<
||
!/bin/sh
t=
mktemp
;tail -n +3 $0 | gcc -x c - -o $t; $t; rm $t; exit ||<
という部分でプログラムの残りの部分を読み込んでコンパイル実行、実行後削除します。 *1
- コンパイルエラーの表示が二行分ずれる。
- $0 がコマンドに渡されない
- 2行はちょっと冗長
- 実行エラー時に実行ファイルが残ってしまう。
と欠点はありますが、手軽に仕えるので僕は気に入っています。