今回はデバッグ(≒つまり開発)に関する話。
文字プリントやログファイルはきだしによるデバッグは定番。デバッグの基礎だという人もいる。
そんなとき便利なのが、
__FILE__ と __LINE__。
読むと
アンダーバーアンダーバーファイルアンダーバーアンダーバー
アンダーバーアンダーバーラインアンダーバーアンダーバー
とかなりしつこい笑。
対象の言語は、CやC++。
コンパイラが解決してくれるマクロで
__FILE__ には、そのプログラムソースのファイル名を表すchar *
__LINE__ には、そのプログラム行を示すint
が、適用される。
nanka.c
void main()
{
printf("%s:%d\n",__FILE__,__LINE__);
最初の初期化();
printf("%s:%d\n",__FILE__,__LINE__);
次の初期化();
printf("%s:%d\n",__FILE__,__LINE__);
}
これを実行すると
nanka.c:7
nanka.c:9
nanka.c:11
などと表示される。
ソースが複数あっても
nanka.c choi1.c choi2.c
ファイル名が表示されるので安心。
ポイントは
printf("%s:%d\n",__FILE__,__LINE__);
ここの書き方はかえずにどんどんデバッグプリントを埋め込んでいけること。
プリントデバッグは
「ああ、ここまではとりあえず、処理が進んでいるんだ」
「こっち側の判定にいってるんだ」
と使える。
printfの部分 をログはきだし用の関数に変えたり。
もっといろいろやる関数にとりかえることもできる。
///////////////////////////
int table[1024]; //なんか重要なテーブル
void main()
{
ごっつい判定(__FILE__,__LINE__);
最初の初期化(); // table をごちゃごちゃ設定
ごっつい判定(__FILE__,__LINE__);
次の初期化(); // ここでもtableをごちゃごちゃ設定
ごっつい判定(__FILE__,__LINE__);
なんかやって(); // ここでもtableは変更される
ごっつい判定(__FILE__,__LINE__);
さらになんかやって(); // ここでもtableは変更される
ごっつい判定(__FILE__,__LINE__);
}
void ごっつい判定(char *filename,int num)
{
filenameやnum とともに
tableの中身を意味を解析して表示。
なんならもっと深くチェックして
}
///////
void GetTickCount();を使って
void チックカウントつきプリント(char *filename,int num)
{
printf("%d:%s:%d\n",GetTickCount(),filename,num);
}
とか、さらに前回プリントから1秒あいてたら要注意マークつけるとか
void チックカウントつきプリント(char *filename,int num)
{
ima=GetTickCount();
if(ima-m_mae>1000){
printf("ずいぶん時間がたったね---------\n");
}
printf("%d:%s:%d\n",ima,filename,num);
m_mae=ima;
} // m_mae 変数のあたりは C++でクラスで組むとよい。
よろしく。