セマンティクスを確認するためだけに、非常に短いことを試してみたいことがあります。一時ファイルの作成とボイラープレートの挿入には 30 秒以上かかるため、次のスクリプトを使用します。
#!/bin/sh
body="$1"
out=$(mktemp /tmp/ccrun-XXXXXX)
src=${out}.c
cat > ${src} <<EOF
#include <limits.h>
#include <string.h>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#define UNUSED __attribute__((unused))
int main(int UNUSED argc,char UNUSED *argv[])
{
EOF
echo "$body" >> ${src}
echo -e "return 0;\n}" >> ${src}
cc -std=c99 -Wall -Wextra ${CCRUN_FLAGS} -o ${out} ${src} -lm
shift
echo ${out} "$@"
${out} "$@"
#rm ${out} ${src}
サンプル呼び出し (このコードは関数ポインターの配列を静的に初期化します) は次のようになります。
$ ccrun 'int f(int a){return a+1;} int g(int a){return a+2;} int (*farr[2])(int) = {f,g}; for (int i=0; i<2; i++) printf("%d %d\n",i,farr[i](i));'
/tmp/ccrun-6nT4Wo
0 1
1 3
少し変更したい場合は、コマンド ラインを編集するだけです。コマンド ラインで扱いにくくなった場合は、一時ファイルを編集します。この場合は/tmp/ccrun-6nT4Wo.c
. 実行可能ファイルへのコマンド ライン引数は、プログラムの後に指定できます (最初の引数)。実行可能ファイルはそのまま残されるため、再コンパイルせずに実行できます。どの言語でも同様のことができます。