[an error occurred while processing this directive] [an error occurred while processing this directive]

いまさら、ヘッダファイルでのプロトタイプ宣言

Cでは、関数にはプロトタイプを書くことになっている。 一つのファイルなら別に書かなくても問題ないけど、複数ファイルにまたがる時は書かないとエラー出ます。
例えば、addが書いてあるadd.cとこれを用いるmain.cをコンパイルすることを考える。
[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でオブジェクトコードを別々に作ってからリンクしてもいい。
unix系な人はMakefile書くと楽。
[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と打てばコンパイルできる。

C++のプロトタイプ宣言

Javaからの類推で全てを片付けてたら、ちょっとツケが回ってきました。 というわけで、C++のクラス定義のおさらい。 そういえば今まで複数のファイルに渡るプログラムはCかJavaでしか書いたこと無かったような。
Cでは、他のファイルからアクセスする関数の宣言(プロトタイプ宣言)や構造体の宣言はヘッダ(*.h)に、 実際の関数の実装や、自分のファイルからしかアクセスしない構造体の宣言はソース本体(*.c)に書きます。 例えば、こんな感じ。
[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みたく書いても十分だけど。 インライン展開については色々紹介があるので、他のサイトをご覧下さい。
[an error occurred while processing this directive]