Seasons.NET

ちょっとした技術ブログです

#if 0ハックすごくね?すげーってw

#If 0ってC,C++では、#endifまで問答無用でコメントにしますが、
これを使ったハックがすごく便利。


元ネタ
http://gpwiki.org/index.php/SDL:Tutorial:Using_SDL_net

#if 0
#!/bin/sh
gcc -o a a.c
exit 
#endif

int main( void )
{
    printf( "Hello\n");
    return 1;
}

これを保存して、実行属性をつけてから(chmod 755とか)
ターミナルで、

# ./a.c

と打ち込むと、
aという実行ファイルが生成される。


んで、./aと打ち込むと
Helloと表示される。


今までは、Makefileか直接、gcc -o a a.cとかやっていた作業が、
ソースコードMakefileの代わりになるわけ。


なぜこんな事ができるかってーと、
shのシェルスクリプトは、#がコメント扱いなので、
#if 0を読み飛ばして、#!で利用するコマンドを設定し、
gccの箇所を実行します。
んで、exitでコマンドを終了し、ターミナルに戻ってきます。


んでソースコードコンパイル時は、#if 0〜#endifまでコメント扱いになるので、
ここは無視されるわけ。



追記:
id:nakamura001さんからアドバイス頂きました。
id:kompiroさんから指摘を頂きました。
exitが抜けていたため、処理が続行されてしまうので、修正致しました。

#if 0
#!/bin/sh
src = $0
obj = ${src%.*}
gcc -o $obj $src
exit
#endif

としておくことでどんなソースコードでも
コピペして使う事ができます。