単純にすべてのヘッダーファイルを含めるのは正しいですか?

システムヘッダファイルの名前を覚えていると痛いです...

既存のすべてのヘッダーファイルを一度に含める方法はありますか?

なぜ誰もそれをしないのですか?

2
追加された
ビュー: 1
もちろん、 "方法があります"。しかしそれは良い考えではありません。たぶん経験豊富なCプログラマは、依存関係がどこに宣言されているかを知って知っているだけです。
追加された 著者 Kerrek SB,
これが良い考えだった場合 - 言語全体のヘッダファイルは1つしかありません
追加された 著者 Adrian Cornish,
私はそれが信じられないほど悪い考えだと思う!
追加された 著者 ldav1s,
@AdrianCornish IIRCは、非常に早いpre-STL C ++標準ライブラリ草案で、すべてのC ++ヘッダーを含むヘッダーを持っていました。その後、正気の状態で、彼らはそれを取り除きました...そしてドラフトの残りの部分はSTLで始まりました。
追加された 著者 ldav1s,
風刺は答えに属しません。答えはちょうどそのためのものです。
追加された 著者 Ken White,
@ネイト、私は決して答えにユーモアや皮肉がなければならないとは言いませんでした。私は、ユーモアや風刺は他の内容で答えを構成してはならないと述べました。私は実際に私の友人や知人がユーモアの良い感覚を呼んでいる(彼らはとにかく言う)。他に何もないユーモア/風刺は、コメントとして投稿し、質問への回答として投稿してはいけません。このサイトは、質問と回答に多くの騒音や混乱がないので、部分的にうまくいきます。私はそのように保つことに賛成する。 :)あなたが気づくなら私は誰にでもダウンボトムをしなかった - 私はldav1sに答えを削除する機会を与えた。
追加された 著者 Ken White,
それが覚えているような苦痛であれば、あなたはeclipseとその "add include"機能を使うことができます。
追加された 著者 Nate,

6 答え

不要なヘッダーファイルを含めることは非常に悪いです。コンパイルの遅さの問題は重要ではないかもしれません。より大きな問題は、依存関係を隠すということです。ソースファイルにインクルードするヘッダーファイルのセットは、モジュールが依存する機能のドキュメントでなければならず、外部のドキュメントやコメントとは異なり、コンパイラーによって完全性が自動的にチェックされます(必要なヘッダーファイルをインクルードしないと、エラー)。不要な依存関係が存在しないようにすることで、移植性が向上するだけでなく、純粋に計算的なものであるべきか、まったくデータ構造の管理でなければならないモジュールがファイルシステムにアクセスしている場合など、不要な、潜在的に危険な相互作用を追跡するのにも役立ちます。

これらの原則は、ヘッダーが、独自のプログラムまたはサードパーティのライブラリ内のモジュールの標準システムヘッダーまたはヘッダーであるかどうかに関係します。

9
追加された

ヘッダーファイルはすべて含まれません。あまりにも多くあり、それらのいくつかは他のファイル(ncurses.hやcurses.hなど)と相互に排他的です。

プログラムを最初から作成しても、それほど悪くはありません。いくつかは覚えやすいです:stdio.hは FILE のものです;任意の文字分類のためのctype.h、malloc()などの使用のためのalloc.h

あなたが1つを覚えていない場合:

  • #include のままにします
  • コンパイル
  • 宣言されていない型や想定されているパラメータ型の関数を呼び出すなど、ヘッダファイルがないことを示す最初のいくつかのエラーメッセージを調べる
  • どの関数呼び出しが原因かを調べる
  • その関数のマニュアルページ(またはコンパイラのドキュメント)を見てください。
  • ドキュメントに表示されている #include を確認して追加します。
  • すべてのエラーが修正されるまで繰り返す

既存のコードベースに追加する方がはるかに簡単です。数百時間または数千時間の勤務時間を要し、 #include を追加する必要はありません。

5
追加された

ソースコードファイルは、コンパイラが処理する前に事前処理されており、 #include 文はプリプロセッサが使用する指令の1つです。事前処理されると、 #include ステートメントは、インクルードされているファイルの内容全体に置き換えられます。すべてのシステムファイルをインクルードした結果、非常に大きなソースファイルが生成され、コンパイラはそのファイルを処理する必要があります。コンパイル時に時間がかかることがあります。

5
追加された

いいえ、それはひどい考えであり、あなたのコンパイル時間を大幅に増やし、膨大な量の未使用コードを含めることによって、exeをもっと大きくする可能性があります。

1
追加された
@Oli - おそらくC言語の場合 - 私はC ++のほうが余分なテンプレートコードを生成する可能性があると考えていました。
追加された 著者 Adrian Cornish,
これは、exeサイズに影響を与えるべきではありません。
追加された 著者 Oliver Charlesworth,

あなたが話していることは分かっていますが、使用している関数の関数プロトタイプを再確認する必要があります(私は毎日使用しないでください) - コードをコピーして貼り付けます> #includes を直接関連する機能のマンページから削除してください。私は既にマンページ( vim(1)の単純な K )を見ているので、余分な負担を感じることはありません。

1
追加された

すべてのインクルードを入れる「マスター」ヘッダーを作成できます。その後、他のすべてにそれを含める!矛盾する定義と循環参照に注意してください...だから.... Master1.h、master2.h、...

それを主張していない。ただ言って。

1
追加された