GNU Globalでプロトタイプ宣言リストを作る

うっかりプロトタイプ宣言するのを忘れていて、一個一個確認しながらリストを作るのが面倒なときにglobalで関数タグを抽出する方法です。
実験用ソースは、「GNU GlobalでC言語ソースを見る」で使ったものを使います。

takk@deb8:~/dummy$ indent -npsl func*.c

関数を型も名称と同じ行に揃えた上で、タグを打ちます。

takk@deb8:~/dummy$ gtags
takk@deb8:~/dummy$ global -f func_*.c | cut -b40- | sed -n 's/$/;/;/^\w/p' > proto.h
takk@deb8:~/dummy$ 

global -fコマンドで表示された関数一覧に;(セミコロン)をつけて、ヘッダにするだけです。

takk@deb8:~/dummy$ head proto.h
void func_001 (void);
void func_002 (void);
void func_003 (void);
void func_004 (void);
void func_005 (void);
void func_006 (void);
void func_007 (void);
void func_008 (void);
void func_009 (void);
void func_010 (void);
takk@deb8:~/dummy$ 

これで一応作成完了です。
使えるものになっているでしょうか? ビルドして確認してみます。
func_001からfunc_002を呼び出していってfunc_100までいったら何もせず終了するだけのプログラムにするため、
現在入っているfunc_101の呼び出しは削除します。

takk@deb8:~/dummy$ grep func_101 *.c
func_09.c:  func_101 ();
takk@deb8:~/dummy$ sed '/func_101/d' -i func*.c
takk@deb8:~/dummy$ grep func_101 *.c
takk@deb8:~/dummy$ 

func_001の呼び出しとmain関数がないので、ソースを書きます。

takk@deb8:~/dummy$ cat main.c
int main()
{
	func_001 ();
}
takk@deb8:~/dummy$ 

全cソースに、proto.hのインクルードを追加します。

takk@deb8:~/dummy$ sed '1i#include "proto.h"' -i *.c
takk@deb8:~/dummy$ grep proto.h *.c
func_00.c:#include "proto.h"
func_01.c:#include "proto.h"
func_02.c:#include "proto.h"
func_03.c:#include "proto.h"
func_04.c:#include "proto.h"
func_05.c:#include "proto.h"
func_06.c:#include "proto.h"
func_07.c:#include "proto.h"
func_08.c:#include "proto.h"
func_09.c:#include "proto.h"
main.c:#include "proto.h"
takk@deb8:~/dummy$ 

ビルドします。

takk@deb8:~/dummy$ gcc *.c
takk@deb8:~/dummy$ ls a*
a.out
takk@deb8:~/dummy$ 

うまくいったのかチェックのため、わざとプロトタイプをコメントアウトしてビルドをかけてみましょう。

takk@deb8:~/dummy$ sed 's/^/\/\//' -i proto.h
takk@deb8:~/dummy$ head -3 proto.h;tail -3 proto.h
//void func_001 (void);
//void func_002 (void);
//void func_003 (void);
//void func_098 (void);
//void func_099 (void);
//void func_100 (void);
takk@deb8:~/dummy$ gcc *.c 2>err;grep warn err | wc -l
90
takk@deb8:~/dummy$ 

プロトタイプがないと90個warningが出てるようなので、先ほどのビルドはうまくいってそうです。

Leave a Reply

Your email address will not be published. Required fields are marked *

CAPTCHA