C言語復習ラスト。ライブラリについて
ライブラリは今までよく知らなかったので、復習ではない気がする。
ライブラリとは
このプロセスの中の .o
ファイルをまとめてライブラリを作ることができる
$ ar -r mylib.a a.o b.o ar: creating archive mylib.a $ ls -alt -rw-r--r-- 1 staff 1768 7 17 00:07 mylib.a -rw-r--r-- 1 staff 748 7 16 19:13 b.o -rw-r--r--@ 1 staff 748 7 16 19:13 a.o $ ar -t mylib.a __.SYMDEF SORTED a.o b.o
- 関数を使うにはプロトタイプ宣言が必要
#include<stdio.h>
とmain関数の間にある関数の宣言のやつ- main関数の手前に関数を定義してしまえばプロトタイプ宣言を書かなくて良いのではないだろうか?(手抜き)
- この方法を採用すると、呼び出し関係を把握して、関数の依存性を整理して順番に定義する必要がある(非常に手間)
- main関数の手前に関数を定義してしまえばプロトタイプ宣言を書かなくて良いのではないだろうか?(手抜き)
#include<stdio.h> //このプロトタイプ宣言を入れとけば関数の依存関係は気にしなくて良くなる。 //void a(); //void b(); void a(){ b();//関数bを呼び出しているが、この呼び出しより上に定義されていないためコンパイルエラー } void b(){ puts("test"); } int main(){ a(); }
コンパイルエラー other/prototype.c:4:3: warning: implicit declaration of function 'b' is invalid in C99 [-Wimplicit-function-declaration] b(); ^ other/prototype.c:6:6: error: conflicting types for 'b' void b(){ ^ other/prototype.c:4:3: note: previous implicit declaration is here b(); ^
- 少し規模の大きいプログラムなら、プロトタイプ宣言としてmain関数の前にとりあえず宣言しておいたほうが楽。
- というわけでC言語では慣例的にプロトタイプ宣言をすることになっている
- もう一度基礎からC言語 第15回 関数の宣言~ライブラリとヘッダファイル プロトタイプ宣言の省略
- ライブラリを利用するたびに自分で書くのは面倒なのでヘッダファイル
.h
を作ってプリプロセッサに書かせる
mylib.hの内容
void a(); void b();
libtest.cの内容
#include "mylib.h" main() { a(); b(); }
- コンパイルコマンド
$ gcc libtest.c mylib.a
もちろんライブラリを利用するプログラムは.h
ファイルを展開するプリプロセッサを使わなくても
自分でライブラリの中の関数をプロトタイプ宣言に追記すれば利用することができる。ただし、こういうことは面倒なので、基本的には.h
ファイルを用意して#include
すべき
void a(); void b(); main() { a(); b(); }
#include
プリプロセッサの利用有無による結果の違い
gcc -E
コマンドの結果も大して変わらない
#include
のプリプロセッサ利用
$ gcc -E libtest.c mylib.a clang: warning: mylib.a: 'linker' input unused [-Wunused-command-line-argument] # 1 "libtest.c" # 1 "<built-in>" 1 # 1 "<built-in>" 3 # 341 "<built-in>" 3 # 1 "<command line>" 1 # 1 "<built-in>" 2 # 1 "libtest.c" 2 # 1 "./mylib.h" 1 void a(); void b(); # 2 "libtest.c" 2 main() { a(); b(); }
#include
のプリプロセッサ不使用
$ gcc -E libtest.c mylib.a clang: warning: mylib.a: 'linker' input unused [-Wunused-command-line-argument] # 1 "libtest.c" # 1 "<built-in>" 1 # 1 "<built-in>" 3 # 341 "<built-in>" 3 # 1 "<command line>" 1 # 1 "<built-in>" 2 # 1 "libtest.c" 2 void a(); void b(); main() { a(); b(); }
まとめ
ライブラリを作ったなら.h
ファイルも忘れず作ろう!
おしまい。
プログラミング学習シリーズ C言語改訂版 2 はじめて学ぶCの仕組み
- 作者: 倉薫
- 出版社/メーカー: 翔泳社
- 発売日: 2009/02/13
- メディア: 大型本
- 購入: 2人 クリック: 6回
- この商品を含むブログ (3件) を見る