宣言宣言

宣誓!私は!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;
}

以上

コスミー について

昔(?)はゲーム作ってました。 今もなんか作ろうとしています。
カテゴリー: C言語 パーマリンク

コメントを残す

メールアドレスが公開されることはありません。