C言語編 目次

 関数設計

 

・関数名の命名規則
・プログラミングに出る!英単語

 ポインタ

 

・データ型とポインタ

 データ型

 

・char *とconst char *は違う
・符号付きと符号なし

 演算子

 

・三項演算子とデータ型の問題

 制御構文

 

・条件式で代入する
・三項演算子を使ったswitch

 構造体

 

・構造体のサイズとアライメント
・構造体メンバのサイズを知る

 配列

 

・配列使用時の注意
・配列の要素数を知る

 メモリ管理

 

・メモリスタック
・動的メモリ確保とメモリリーク

 モジュール設計

 

・モジュール分割
・汎用モジュールとアプリ依存モジュール

 パフォーマンス
  徹底チューニング

 


・どんな処理に時間がかかるのか
・ファイル入出力の効率化
・アルゴリズムを考える1
・アルゴリズムを考える2

 プリプロセッサの便利機能


・2重インクルード防止

 


トップページへ戻る

2重インクルード防止

 プログラムが大きくなってくると、ヘッダファイルの数もだんだん増えてきます。ヘッダファイルの中で他のヘッダファイルをインクルードして、それをソースファイルにインクルードして…ということを繰り返していると、だんだんごちゃごちゃになってきて収集がつかなくなってきます。

 そうならないように最初から、新しいヘッダファイルを作ったらここにインクルードを追加する…といったようなルールを決めておくべきでしょう。

 さて、ヘッダファイルは2重にインクルードすると、関数やdefineの定義の重複でコンパイルエラーになります。しかし、これはヘッダファイルに次のような記述を書いておくと回避することができます

#ifndef _SAMPLE
#define _SAMPLE

// ヘッダファイルの中身
// 関数宣言 defineなど...

#endif // _SAMPLE

 これはプリプロセッサの機能を使って2重インクルードできないようにしています。上の例で言うと、1回目にインクルードしたときは_SAMPLEが定義されていないので、ヘッダファイルの中身がそのまま有効になります。2回目にインクルードしたときはすでに1回目に_SAMPLEが定義されているので、ヘッダファイルの中身はコンパイル時に無視されます。

 これで、何度インクルードしてもヘッダファイルの中身は1回分しかインクルードされなくなります。これはかなり一般的に使われているテクニックです。Cの標準ヘッダなどでも使われています。(stdio.hなどを何度インクルードしてもエラーにならないのはそのためです。)

 ヘッダファイルには必ずこのような記述を書くことを習慣にしましょう。もちらんこれに頼らずに、2重インクルードしないようなインクルード方法のルールを決めておくことが重要です。

 さて、microsoftのcコンパイラの場合は次のような方法でも2重インクルードを防止することができます。

#pragma once

// ヘッダファイルの中身
// 関数宣言 defineなど...

 これはmicrosoftのcコンパイラ独自のプラグマを使っています。