宣誓!私は!C言語を書くときはプロトタイプ宣言をすることをここに誓います!
というわけで、ちょっとしたぼやきですが、プロトタイプ宣言を書いてくれてる方が私は好きです。
C言語における関数の場合、主にグローバルスコープとファイルスコープの関数があります。(細かく言えばブロックスコープもあるかもしれない。)
いろいろ人のソースを見てるとその辺が適当になってたりする。1ファイルからしか参照されていない(またそうあるべき)関数をグローバルスコープにしたり、ヘッダを作らずソースファイルごとにプロトタイプ宣言をしていたり、プロトタイプ宣言をせずに関数定義だけで、定義以降に書かれている関数からだけ参照したり。
一般にはヘッダ(*.h)に関数宣言を書いてソース(*.c)に関数定義を書くと思います。どうしようもなく初歩的なことですが、今後考えが変わる可能性もあるので現在の私のC言語の書き方をまとめておきます。
1.大まかな機能ごとにソースファイルを分ける。
2.ソースと同名のヘッダファイルを作り関数宣言をする。複数のソースの関数をまとめたようなヘッダは作らない。
3.1つのソース内だけで参照される関数はファイルスコープにする。つまりstaticをつける。
4.共通の定数定義やマクロ関数を作る場合はそれ用のヘッダを作る。
5.関数にはJavadoc形式でコメントをつける。コメントは関数宣言、関数定義のどちらに書いてもよいが、宣言のほうを正とする。
6.引数をとらない関数はちゃんとvoidをつける。C言語では宣言でhoge()だと関数定義で引数をとってもよいことになってる。C++だとvoidと同義。
7.(今後思いついたら追記)
ヘッダ(template.h)のテンプレート:
#ifndef TEMPLATE_H__ // 頭にアンダースコア(_)はつけない
#define TEMPLATE_H__
// ////// ヘッダインクルード ///// //
#include <standard.h>
#include "original.h"
// ///// 定数定義 ///// //
#define VALUE (100)
// ///// マクロ関数 ///// //
#define FUNC(X) ((X)*(X))
// ///// 関数宣言 ///// //
/**
* 説明文。Javadoc形式。
* @param time 時間
* @return 0:正常、1:エラー
*/
int sample(int time);
#endif // TEMPLATE_H__
ソース(template.c)のテンプレート:
// ///// ヘッダインクルード ///// //
#include "template.h"
#include <some.h>
#include "myhead.h"
// ///// 内部関数宣言 ///// //
/**
* ファイルスコープの関数。
*/
static void test(void);
// ///// 関数定義 ///// //
/*
* 説明文。Javadoc形式。
* @param time 時間
* @return 0:正常、1:エラー
*/
int sample(int time) {
return 1;
}
/*
* ファイルスコープの関数。
*/
void test(void) {
return;
}
以上