[an error occurred while processing this directive]
[an error occurred while processing this directive][header.h] int add(int, int);/* プロトタイプ */ int main(void); /* プロトタイプ */
[add.c] #include "header.h" int add(int x, int y){ /* 関数本体 */ return x + y; }
[main.c] #include "header.h" int main(void){ /* 関数本体 */ int i = 1, j = 2, k; k = add(i, j); return 0; }コンパイルは、同時にgccに入れてもいいし、-cでオブジェクトコードを別々に作ってからリンクしてもいい。
[Makefile]
all : main
main : main.c add.o
gcc main.c add.o -o main
add.o :
gcc -c add.o
clean :
rm -f *.o main
これで、makeと打てばコンパイルできる。
[test.h]
struct hoge{
int x;
};
int my_func(int);
[test.c]
#include "hoge.h"
int my_func(int x){
/* ここに中身を書く */
}
さて、C++では、Cのstruct(構造体)の自然な拡張としてclassが使えます。この宣言はどこに書くでしょう?
構造体にメンバ関数がくっついたものと考えれば、メンバ変数の宣言とかはヘッダファイルに書いておくのが自然です。
また、メンバ関数の方は、プロトタイプを書くだけなのが自然です。
で、本体に関数の実装を書く。まとめるとこんな感じ。
[test.h]
class hoge{
int x;
public:
int my_func(int);
};
[test.cc]
#include "hoge.h"
int hoge::my_func(int x){
/* ここに中身を書く */
}
ただ、すごく簡単な関数とかだと、分けて書くのも面倒だし、実行時にも関数呼び出しする
コストが無駄です。そこで、こういうのはプロトタイプ宣言の方に書いておくと、インライン展開してくれます。
また、実装の方で関数の先頭にinline を書いてもいいです。
[test.h]
class hoge{
int x;
public:
int my_tiny_func(int x){
/* ここに中身を書く。これはインライン展開される */
return x * x;
}
int my_little_func(int);
};
[test.cc]
#include "hoge.h"
inline int hoge::my_little_func(int x){
/* ここに中身を書く。これもインライン展開される */
}
ま、ファイル一つならJavaみたく書いても十分だけど。
インライン展開については色々紹介があるので、他のサイトをご覧下さい。