前回の続きです。
- 関数ポインタ
戻り値の型 (*ポインタ変数) ( 引数の型) //ex. int (*hoge) (int, char*)
- ソート関数
-
void qsort( const void *ptr, size_t count, size_t size, int (*comp)(const void *, const void *) );
ptr: 配列へのポインタ
count: 配列の長さ
size: 配列の各要素のサイズ
comp: コンパレータ関数 - ヘッダーは
stdlib.h
- コンパレータ関数の返り値(第一引数 - 第二引数 == 正、ゼロ、負)でソート。
- qsort()は、配列の実体を操作。
-
- 関数ポインタ配列とenum
- enum はそれぞれのシンボルに、実際には整数値を割り当てているだけなので、関数ポインタの配列と enum を組み合わせることで、関数の使い分けが楽になる。
- 可変個引数
- ヘッダーは
stdarg.h
-
void hoge (int args, ...) { ~
args は普通の引数。…が可変個引数 -
va_list s;
s は関数に追加した引数を格納する変数 -
va_start (s, args);
可変個引数がどこから始まるかを示す。args は最後の固定引数の名前 -
va_arg (s, [型]);
va_arg ()を使って読み取り va_end (s)
- ヘッダーは
- ヘッダファイルの共有
-
<hoge.h>
標準ヘッダディレクトリ。
UNIX系だと /usr/local/include か usr/include にだいたい入ってる。 -
"hoge.h"
カレントディレクトリ。 - 標準以外のディレクトリからヘッダファイルをインクルードする場合。
インクルード文にフルパスを含める。
gcc の-I
オプションでディレクトリを指定する。
-
- オブジェクトファイルの共有
- gccにフルパスを追加する。
- ライブラリ作る。
- スタティックライブラリ
- ライブラリアーカイブは
lib
で始まり.a
で終わる。 -
.a
ファイルの中身を見るのは$ nm
もしくは$ ar -t
コマンド(あんまりよく分かってない) -
$ ar -rcs libhoge.a fuga01.o fuga02.o fuga03.o
r
:.a ファイルが既に存在する場合置き換える。
c
:フィードバックなしにアーカイブを作成。
s
:.a ファイルの先頭にインデックスを作成する。
/usr/local/lib などの標準ディレクトリか独自ディレクトリに入れる。 - コンパイル
l
スイッチを使用。複数ライブラリを使ってる場合は-l
も複数設定可。
ライブラリの前にソースファイルを列挙するべし。
$ gcc hogefuga.c -lhoge -o hogefuga //libhoge.a に対応
独自ライブラリに格納してる場合は、ソースの後に-L
オプションを使って検索するディレクトリ指定。
- ライブラリアーカイブは
- ダイナミックライブラリ
- まずはオブジェクトファイルを作成
$ gcc -fPIC -c hoge.c -o hoge.o
fPIC
オプションは指定しなくても問題ないことがほとんど。 - ダイナミックライブラリの呼び名
Win:.dll
Linux, Unix:.so
Mac:.dylib
- 作成方法
$ gcc -shared hoge.o libhfcal.dylib
ライブラリは作成時に、ファイル内にライブラリの名前を格納するので、名前を変更するときは再コンパイルが必要。 - 使い方はスタティックライブラリと一緒。
Linux の場合は、コンパイル時にダイナミックライブラリのパス名を記憶しないので、標準ライブラリ以外に格納した場合は、LD_LIBRARY_PATH
変数にディレクトリを追加してエクスポートしておく必要がある。
- まずはオブジェクトファイルを作成
長くなりそうなので、続きは次回で。