問題タブ [multiple-inclusions]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 複数の cpps に同じヘッダーを含めることによる複数の定義エラーの繰り返し
したがって、私が何をしようとも、同じプロジェクト内の複数のソース コード ファイルに同じヘッダー ファイルをインクルードした結果、Dev C++ が多数の複数定義エラーを吐き出すことを避けられないようです。すべてのソース コードを 1 つのファイルにダンプし、ヘッダーを 1 回だけインクルードする必要はありません。ファイルが非常に長くなり、管理が難しくなるためです。
本質的に、これは何が起こっているかです:
Cpp ファイルの例 (ほとんどすべて次のようになります):
この 1 つのヘッダーを含む約 5 つの cpp ファイルがあり、それぞれがヘッダー ファイルにある異なるタイプの構造体を扱っていることに注意してください。この例では、実際のヘッダー ファイルにはさらに多くのメンバーを持つ約 4 ~ 6 個の異なる構造体があるのに、いくつかのメンバーを含む構造体は 1 つしかありませんでした。これを含めたすべてのファイルは、この例で見られるのと同じ式に従います。
これで、ヘッダー ガードは個々の cpp ファイルがヘッダー ファイルを複数回インクルードするのを防ぐだけであることがわかりました。何が起こっているように見えるかは、コンパイラが各 cpp の開始時にインクルードを読み取るときに、ヘッダー ファイルを最初から定義し直して、次の行と行を吐き出すことです。
ヘッダーを含むプロジェクト内のほぼすべての cpp ファイルで、このセットが表示されます。構造体と構造体変数の定義をcppファイルに移動しようとしましたが、他のcppファイルはそれらを表示したり操作したりできません。プロジェクト内のすべてのファイルが機能する必要があるため、これは非常に重要ですこれらの構造体で。
しかし、この問題で最も紛らわしい部分については、もう少し説明が必要です。
このプロジェクトでこれらの複数のファイルをセットアップする方法は、私が作業している本、John S. Harbour による All In One Game Programming と同じです。同じプロジェクト内の複数の cpps によって含まれる 1 つのヘッダーを要求する本のサンプル プロジェクトのファイルを作成したときに、まったく同じ問題に遭遇しました。
私はそれらを本から一語一語入力することができました、そして私は一語一語を意味します...
そして私はプロジェクトのすべてのcppについて一連のMDエラーを得るでしょう.
本に付属の CD からサンプル プロジェクトを読み込んだ場合、問題なくコンパイルおよび実行されますが、ファイル自体とプロジェクト オプションは、私が作成したものとまったく同じように見えます。
独自のプロジェクト ファイルを作成し、サンプル プロジェクトのソース ファイルとヘッダー ファイルを CD から追加しただけでも、これもコンパイルおよび実行されますが、それらと私の違いはわかりません。
それで、私は自分のプロジェクト ファイルを作成し、空のソース ファイルとヘッダー ファイルを作成してそれに追加し、対応するはずの CD 上のファイルから内容をコピー アンド ペーストして埋めてみました (同じ働いていたもの)。確かに、私は同じことを得るでしょう...何行ものMDエラーメッセージ。
私は絶対に困惑しています。これらすべての方法を何度も繰り返しましたが、コードの入力ミスやミスコピーではないことを確信しています。事前に作成されたファイル自体に何かがあるようです。いくつかの構成設定または私が完全に欠落している何か...それにより、自分で作成したファイルは正しくコンパイルされませんが、正しくコンパイルされます。
c - コンパイル ガードが複数の定義のインクルードを防止しないのはなぜですか?
複数の *.c ソース ファイルに含まれるヘッダー ファイル xh があります。このヘッダー ファイルには、いくつかの構造変数が定義されています。
次のように、ヘッダー ファイルの先頭に複数の包含防止ガードを配置しました。
ビルド時に、複数の定義に関連するリンカー エラーが発生します。私は問題を理解しています。
私が持っているように、ヘッダー ファイルの上部にある複数のインクルージョン防止ガードは、ヘッダー ファイル xh の複数のインクルードを防ぎ、それによって xh にある変数の複数の定義を回避しませんか?
#pragma
この特定のコンパイラでは一度は機能しません。解決策は何ですか? 誰かがこの回答を同様の質問に投稿しました。私にはうまくいかないようです。このソリューションはどのように機能しますか?
c++ - 二重インクルージョンの回避: プリプロセッサ ディレクティブとメイクファイル
私は、frankenstein や 1 ファイルの数千行のプログラムから、適切に構造化され、組織化された複数ファイルのプログラムへの移行に取り組んでいます。今のところ (素朴に) 自然に思えるのは、3 つのファイルのヘッダー インクルードのラブ トライアングルを作成
する
こと
です
。他のファイル間で必要なメソッド、構造体など。
そしてもちろん、二重包含エラーが発生しています。
私の質問:ヘッダーでプリプロセッサ ディレクティブを使用してこれらの問題を回避する必要があります (たとえば、構造体、メソッドなどを完全にヘッダーに含める)、またはメイクファイルを使用してコンパイルする必要があります (この問題の解決にも使用できると聞いています- --しかし、私はそれを作ったことがない)?
c - .hファイルを.cと#ifdefヘッダーガードでリンクする
.hファイルと.cファイルのリンクに問題があります。この問題に関するスレッドもいくつか読んでいますが、それらはすべて少しあいまいですが、それでもその概念を完全に理解することはできません。また、リンクの問題がたくさんあります。 、私がacで使用するbcとbhを持っていて、bhをacとbcの両方に含めるかどうか混乱しているとしましょう。cuzbc自体がbhで定義された構造を知る必要があります。私は、bhでプロトタイプを持ち、定義されている関数を持っています。 bhの構造も使用するbcでは、imはbc cuzにbhを含めていません。これは、bhがbcの関数を使用するacへのインターフェイスに似ていることを知っているためです。ここでより明確な例
bhファイル
bcファイル
acファイル
cygwinでコマンドを実行しました:gcc bc ac -g
紛らわしい部分ですが、リンクエラーが発生しました。bcをコンパイルすると、bh Cuzの構造とプロトタイプを検出できません。私が知っているのは、bhを使用してacからbcをリンクすることだけですが、両方の.cをコンパイルすると、そのbcはその構造とプロトタイプを見つけることができません、
なぜbcにbhを含めなかったのですか? 回答:Cuzは私が知っていることですが、bhはすでにacに含まれており、bcに再び含めると、ダブルインクルージョンを実行します<---これまでに学んだことであり、#ifdefがあることはわかっていますが、それはうまくいきません、多分私はまだそれを使う方法を知りません、あなたが知っているならば、これについて気軽に話し合ってください。
これをどうやって進めるかについて何か考えがあれば、遠慮なく教えてください。
#ifdefディレクティブがありますが、これを行う方法がわからないようです。
注:上記のすべてのコードが構文的に正しいと仮定します。スペルミスのある単語がある場合は無視してください。私は.hと.cの間にインクルードした後のみです。
c++ - ソースファイルに冗長な複数ヘッダーが含まれるのを防止しますか?
この構造のプロジェクトを見つけました:
私には、これは少し冗長に思えます。
コンパイラがインクルード ファイルを無視できることを認識するためにインクルード ファイルを開く必要がないため、ビルド中にパフォーマンスがわずかに向上する可能性があります。しかし、今日のコンパイラには、そのようなものを最適化するためのより良い方法があると思います。
私が間違っている?
c++ - 複数のインクルードから保護する必要のないヘッダー ファイルの種類は?
dcmtk のソース コードを読んだところ、 ofstdinc.h に次のコメントが見つかりました。
また、複数のインクルードから保護すべきではないヘッダー ファイルの種類は何ですか?
c++ - 複数収録。許されるとどうなるの?
私は C++ を初めて使用し、複数の包含の解決に関する多くの記事を読んできました。私はマクロとメソッドの両方に出くわし、#pragma once
コンパイル時のエラーを解決するために自分で実験しました。ただし、それらのいずれも、それらによって引き起こされる可能性のある問題について言及していません。
複数の包含が許可されるとどうなりますか?
c++ - 互いに参照している 2 つのクラス: 不明なオーバーライド指定子エラー
病院で看護師をスケジュールするプログラムを書いています。2 つのクラス間の包含ループに行き詰まっていますが、どこでエラーを起こしたのかわかりません。Preference Profile のインスタンスを持つ看護師クラスがあります。この設定プロファイルには、Nurse オブジェクトへのポインターがあります。
看護師クラスのヘッダー:
PrefProfile クラスのヘッダー:
PrefProfile にはナース オブジェクトへのポインターのみが含まれているため、ヘッダー ファイルを含める代わりに、それを前方宣言しました。ナース クラスには、PrefProfile のヘッダーが含まれています。ナース クラスのオブジェクト pref で次のエラーが発生しました: C3646 'pref':unknown override specifier。
私はC++にかなり慣れていないので、参照へのこのアプローチを使用する必要があることを読みました。この種の包含ループを回避する簡単な方法はありますか? または、コードに何か不足していますか?
c - ヘッダー ファイルの複数のインクルード エラー - C
少数のファイル (.c および .h) しかない比較的小さなプロジェクトがあります。私は複数の包含エラーと戦ってきました(と思います)。そこで、必要な他の各ヘッダー ファイルを含む master.h ヘッダー ファイルを作成しました。すべてのヘッダー ファイルには、
複数の包含を防ぐためのガード。私の各ファイルには、上部に master.h ファイルが含まれています。これが私がこれがどのように機能することを期待するかです。
- コンパイルされた最初のファイルには、#include "master.h" が表示されます。
- このファイルが処理されるのはこれが初めてであるため、__MASTER はまだ定義されていないため、ファイルが処理されます。
- コンパイラは次のヘッダー ファイルをインクルードします。同様に、それはまだ処理されていないため、コンパイラはそれを処理し、定義され、再度処理されることはありません。
- これは、すべてのファイルが処理され、再処理されないように定義されるまで、master.h 内のすべてのヘッダー ファイルに対して続行されます。
- master.h ファイルについても同様です。一度処理されて完了すると、ガードにより再度処理されることはありません。
これは複数の包含を防ぐべきではありませんか?
ここにエラーがあります。
関係ないことが判明したため、この投稿の情報の一部を編集/削除しました。リンカーが抱えていた「複数の定義」の問題は、実際の「複数の定義」や変数の包含によるものではないようです。代わりに、変数 (この場合はフラッシュ内の const) の宣言と定義が同時に行われたためであるかのように見えます。宣言をヘッダー ファイルに分割し、実際の定義または割り当てを .c ファイルに分割すると、問題はなくなりました。問題の「変数」の 1 つに対する修正の例を次に示します。ここで、変数の宣言と定義の側面にさらに注意を払います。使用したツールは GCC です。コメントありがとうございます。