C言語初心者がIDEを使わずに、エディタだけでコードを書いている時に、コードを読み進めていくヒントを自分なりにまとめました
2016.05.30 追記
この記事に書いているような面倒なことはしなくとも、GNU GLOBALを使えば簡単にコードを読むことができるようになります
今まで知らなかった事が恥ずかしい程の常識だったようですが、自戒の念を込めてこの記事は残しておくことにしました
GNU GLOBALの使い方については別記事にまとめましたので、よろしければそちらもご覧ください
定義されている関数がどこで呼ばれているか調べる方法
関数がstaticで定義されているか
例えば以下のように、関数定義の前に"static"とあれば、そのファイルでしか使われていない (localな意味)
static hmstime_t normalizeTime(hmstime_t t)
{
:
}
ソースファイルに宣言があり、extern修飾されていない
ソースファイルの中に宣言があれば、そのファイルでしか使用できない
ただし、宣言がextern修飾("extern"の後に宣言が書かれる場合)されていれば、どこか別の場所で定義されているので、別の場所でも使われているだろう
:
/*** 宣言 ***/
hmstime_t addTime(hmstime_t t1, hmstime_t t2);
:
/*** 定義 ***/
hmstime_t addTime(hmstime_t t1, hmstime_t t2)
{
double x1,x2;
x1=convertTimetoDouble(t1);
x2=convertTimetoDouble(t2);
return convertDoubletoTime(x1+x2);
}
:
ソースファイルとは別に、宣言がヘッダファイルにある場合はそのヘッダがincludeされている箇所で使用されている可能性がある
宣言のあるヘッダを検索する
grep "%%関数名%%" `find . -name '*.h' -o -name '*.hpp'`
ヘッダが分かれば、それをincludeしているコードを調べてみる
$ grep "%%ヘッダファイル名%%" * |grep "include"
includeされているファイルがヘッダファイルの場合、更に別のヘッダからincludeされている可能性があるので、
物によっては、追っていくのが大変になるかもしれない
分からなそうなので、コード全体を検索してみる
grep "%%関数名%%" `find . -name '*.c' -o -name '*.cpp'`
突然に関数が使われる
そのソースファイルでincludeしているヘッダから宣言してる箇所を探す
ソースコードの先頭の方に"#include"で始まる行が幾つかあるはず
#include <ctype.h>
#include <errno.h>
#include <pthread.h>
:
#include "newfunc.h"
:
includeのヘッダが"<>"で括られている場合と、ダブルクォート(")で括られている場合があるが、以下の通りに使い分けされていることが多い
- "<>"で括られる場合はシステムや、開発環境で用意されているヘッダ
- ダブルクォート(")はソースコードの開発者が独自に作ったヘッダ
なので、独自に作られたものであれば、ダブルクォートで括られたヘッダから見ていった方が良い。
独自のではなさそうならば、man %%関数名%% で使い方が出てくるかもしれない (システムのincludeは慣れないと読みにくいものなので、マニュアルで概要を見る方がよいだろう)
宣言を見つけた場合
関数が定義されているソースコード(大抵はヘッダと同じ名前)を見る
※ソースコードが特定できなければgrepして探してみる
※見つからなければ共有ライブラリや、プリコンパイルされたオブジェクトの関数を使っている可能性もある。その場合、コードがオープンになっていなければ中身を知ることは難しい