Saturday, September 1, 2018

C - ヘッダーファイル

ヘッダファイルは拡張子.hを持つファイルで、C関数の宣言といくつかのソースファイル間で共有されるマクロ定義を含んでいます。ヘッダーファイルには、プログラマが書き込むファイルと、コンパイラに付属するファイルの2種類があります。

コンパイラに付属のstdio.hヘッダーファイルが含まれているのと同様に、プログラムでヘッダーファイルを使用するように要求するには、Cプリプロセスディレクティブ#includeを使用します。

ヘッダーファイルを含めることは、ヘッダーファイルの内容をコピーすることと同じですが、エラーが発生しやすく、ヘッダーファイルの内容をソースファイルにコピーすることは好ましくありません。特に、プログラムに複数のソースファイルがある。

CまたはC ++プログラムの簡単なプラクティスは、すべての定数、マクロ、システム全体のグローバル変数、関数プロトタイプをヘッダファイルに保存し、必要なときはいつでもそのヘッダファイルをインクルードすることです。


構文を含める
ユーザーヘッダーファイルとシステムヘッダーファイルの両方は、前処理ディレクティブ#includeを使用してインクルードされます。それには以下の2つの形式があります

#include <file>

この形式は、システムヘッダファイルに使用されます。 システムディレクトリの標準リストで 'file'という名前のファイルを検索します。 ソースコードをコンパイルするときに、このリストに-Iオプションを付けてディレクトリを追加することができます。
#include "file"

このフォームは、自分のプログラムのヘッダファイルに使用されます。 現在のファイルを含むディレクトリの 'file'という名前のファイルを検索します。 ソースコードをコンパイルするときに、このリストに-Iオプションを付けてディレクトリを追加することができます。


操作を含める
#includeディレクティブは、現在のソースファイルの残りの部分を続行する前に、指定されたファイルを入力としてスキャンするようにCプリプロセッサに指示することによって機能します。 プリプロセッサからの出力には、すでに生成された出力が含まれ、続いてインクルードされたファイルの出力が続き、その後に#includeディレクティブの後のテキストからの出力が続きます。 たとえば、次のようにヘッダファイルheader.hがあるとします。
char *test (void);

このようなヘッダーファイルを使用するprogram.cというメインプログラム
int x;
#include "header.h"

int main (void) {
   puts (test ());
}
コンパイラーはprogram.cが読み取ったのと同じトークン・ストリームを表示します。
int x;
char *test (void);

int main (void) {
   puts (test ());
}

一度のみのヘッダー
ヘッダーファイルが2回インクルードされた場合、コンパイラはその内容を2回処理し、エラーになります。 これを防ぐ標準的な方法は、ファイルの実内容全体を条件付きで囲むことです
#ifndef HEADER_FILE
#define HEADER_FILE

the entire header file file

#endif
この構造体は一般にラッパー#ifndefとして知られています。 HEADER_FILEが定義されているため、ヘッダーが再び含まれると、条件はfalseになります。 プリプロセッサはファイルの内容全体をスキップし、コンパイラはそれを2度見ることはありません。


計算されたインクルード
場合によっては、プログラムにインクルードされるいくつかの異なるヘッダーファイルの1つを選択する必要があります。 たとえば、さまざまな種類のオペレーティングシステムで使用される構成パラメータを指定する場合があります。 次のような一連の条件でこれを行うことができます
#if SYSTEM_1
   # include "system_1.h"
#elif SYSTEM_2
   # include "system_2.h"
#elif SYSTEM_3
   ...
#endif
しかし、それが成長するにつれ、退屈になる代わりに、プリプロセッサはヘッダー名にマクロを使用する機能を提供します。 これは計算されたインクルードと呼ばれます。 #includeの直接引数としてヘッダ名を書くのではなく、そこにマクロ名を置くだけです
#define SYSTEM_H "system_1.h"
...
#include SYSTEM_H

SYSTEM_Hが展開され、プリプロセッサは#includeが元々そのように書かれているかのようにsystem_1.hを探します。 SYSTEM_HはMakefileによって-Dオプションで定義できます。

No comments:

Post a Comment

Interfaces and their protocol stacks

インタフェースとそのプロトコルスタック 主要なネットワーク要素に精通した後、これら要素間のインタフェースをよりよく知る時期が来ています。 インタフェースは、MME、SGWおよびPGWが他のネットワーク要素(例えば、HSSまたはPCRF)と協働することを可能にする。 それらの...