3

私は学んCでいて、ファイルをどこに含めるべきかわからない。基本的に、これはファイル内.cまたは.hファイル内で実行できます。

オプション1

test.h

int my_func(char **var);

test.c

#include <stdio.h>
#include "test.h"
int my_func(char **var) {printf("%s\n", "foo");}
int main() {...}

オプション2

test.h

#include <stdio.h>
int my_func(char **var);

test.c

#include "test.h"
int my_func(char **var) {printf("%s\n", "foo");}
int main() {...}

オプション2を使用すると、ライブラリが必要test.h.cファイルに含めるだけで済みます。私が見る例のほとんどはオプション1を使用しています。

いつ何をするかという一般的なルールはありますか、それとも個人的な好みの問題ですか?

4

7 に答える 7

5

sを使用しないでくださいinclude。必要ありません。

「オプション1」のようなものを選びます。なぜ「何か」のようなものですか?のために別のファイルを作成し、mainすべての宣言をとの中に.h、すべての定義を対応するの中に保持するから.cです。

もちろん、両方のオプションが有効です。

にヘッダーを1つだけインクルードする場合は、smainのみを含むヘッダーファイルを作成できますinclude。これは一般的な方法です。このように、複数のヘッダーではなく、1つのヘッダーのみを含めることができます。

于 2013-03-25T10:16:12.107 に答える
3

私はオプション1を好む傾向があります。これは、オプション2で循環依存関係が発生し、すぐに噛み付くためです。入力サイズを小さくすることが、コンパイル時間を短縮するための最良の方法です。オプション2は、本当に必要かどうかに関係なく、あらゆる場所にすべてを含める傾向があります。

そうは言っても、プロジェクトの構造化に役立つものを少し試してみるのが最善かもしれません。厳格なルールは、これらの種類の質問に普遍的に適用されない傾向があります。

于 2013-03-25T10:16:04.670 に答える
2

どちらのオプションも正しいです。C標準では両方のソリューションが可能です

すべてのC標準ヘッダーは、複数回、任意の順序で含めることができるように作成する必要があります。

標準ヘッダーは任意の順序で含めることができます。それぞれが特定のスコープに複数回含まれる場合があり、1回だけ含まれる場合と違いはありません。

プリプロセッサ#ifndefから)

于 2013-03-25T10:14:42.037 に答える
0

普遍的なルールはないと思います(「文法的な」観点からは、どちらのオプションも正しく、機能します)。多くの場合、ライブラリで作業するときに必要になるため、ライブラリに必要なヘッダーを.hファイルにインクルードします(したがって、常に同じヘッダーファイルのセットをインクルードすることは避けます)。エラーが発生しやすい.cファイル内)、または.hファイル自体に記載されているため(たとえば、.hファイルint32_tの関数プロトタイプでasタイプを使用する場合は、もちろんインクルードする必要があります)<stdint.h>.hファイル内)。

于 2013-03-25T10:18:41.430 に答える
0

私はcファイルのincludesを使用することを好みます。プログラムが大きくなっている場合は、1つのヘッダーファイルに何かを含めるのを忘れている可能性がありますが、それは使用する他の1つのヘッダーファイルに含まれています。それらをcファイルに含めることで、他のファイルを編集しているときにインクルードが失われることはありません。

于 2013-03-25T10:35:35.907 に答える
0

私はオプション1が好きです。自分のプロジェクトで何を使用したか知りたいのですが、多くの場合、オプション1はオプション2よりも時間と効率の点で効果的です。

于 2013-03-25T11:27:00.673 に答える
0

特定の方法に従うことを指定する規則はありません。test.cファイルにインクルード/インクルードしない場合でも、test.hファイルにインクルードし、そのtest.hファイルをtest.cにインクルードすれば、それほど気になりません。あなたがそれを明確にしていることを願っています。

これは、#ifndef、#define、#endifなどのプリプロセッサディレクティブがあるためです。それらはインクルードガードと呼ばれます。これらは、inbuildヘッダーファイルで使用されます。ただし、自分で作成したファイルを含める場合は、オプション2を使用するか、安全のためにインクルードガードを使用してください。

インクルードガードは次のように機能します。#ifndef ANYTHING #define ANYTHING .. .. .. #endif

したがって、初めて含める場合、何もまだ定義されていません。したがって、ifndefがtrueを返すと、ANYTHINGが定義され、以下同様に続きます。しかし、次に同じファイルを(誤って)含めると、ANYTHINGが定義され、ファイルが含まれないため、ifndefはfalseを返します。まったく。この保護は、ヘッダーファイルに存在する変数の重複宣言を回避するために必要です。それはあなたにコンパイルエラーを与えるでしょう。

乾杯に役立つことを願っています

于 2013-03-25T12:54:01.953 に答える