※上記の広告は60日以上更新のないWIKIに表示されています。更新することで広告が下部へ移動します。

以下の記事を見つけた。
 http://d.hatena.ne.jp/Seasons/20090504/1241390314

C言語のプリプロセッサ#ifを常にfalseにしてコンパイル時は無視して、シェルスクリプト実行時はプリプロセッサをコメント扱いすることで、ソースファイル実行時にコンパイルする技である。
ソースの冒頭に以下を書き、ソースファイルに実行権をつけ、ソースファイルに引数を付けて実行すると、コンパイルを実行し、できた実行ファイルに引数を渡して実行できる。
つまり、C言語のインタプリタもしくはスクリプトのような使い方ができる。
#if 0
src=$0
exe=${src%.*}
gcc -Wall -o $exe $src
$exe $@
exit
#endif

C言語のプログラムを書くとき、コンパイルオプションやリンクライブラリとかを忘れてしまうので、ソースの先頭にコンパイル命令をコメントで書いておく。上記はその役目もかねられる。

なお、参照元の記事はshebang(#!/bin/sh)を2行目に書いていたが、2行目では意味がないので外している。
shebangがなくても手元のUbuntu11.04では実行できたが、だめな場合やソースに実行権を付けるのがいやなら、/bin/shの引数にソースファイルを渡せばよいでしょう。

最後に引数を表示するだけのサンプルプログラムを書いておく。
$ cat ./main.c
#if 0 
src=$0
obj=${src%.*}
gcc -Wall -o $obj $src
$obj $@
exit
#endif

#include <stdio.h>
int main( int argc, char **argv ){
	int i;
	for( i=1; i < argc; i++)
		printf("argv[%d] = %s\n",i,argv[i]);
	return(0);
}

$ chmod +x main.c
$ ./main.c 1 2 test
argv[1] = 1
argv[2] = 2
argv[3] = test



名前:
コメント: