問題タブ [include-guards]
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++ - ヘッダー ファイルのインクルードに関する混乱
ヘッダーファイルをインクルードすると、次のようになります。
の中へ、
私が言われたことは、mycpp1.cpp が myheader.hMY_HEADER_Hをインクルードすると定義されるため、再度インクルードしようとすると false になるということです。
今、それを mycpp2.cpp に含めたい場合。
それは含まれますか、それとも最初に含まれたときと同じ宣言を使用しますか?
c++ - C++インクルードガード
だから私は標準で自分のヘッダーファイルにインクルードガードを配置する方法を知っています
さて、私の質問は、私自身のものではないライブラリを含めることについてです。良い例でしょう。文字列の使用を必要とするヘッダーファイルがあるので、次のようにします
foo.h
さて、別のヘッダーファイルと呼ばれるものがある場合、たとえば、bar.hこれも使用する必要がありますが<string>、複数のインクルードを防ぐにはどうすればよいですか?STLにはすでにガードが含まれていますか?
c++ - ヘッダー コンテンツ全体をガード トークン内に配置するのはなぜですか?
C と C++ では、宣言と定義が区別されます。
シンボルは何度でも宣言できますが、定義できるのは 1 回だけです。これを学ぶことで、宣言をガードの外側に置き、定義をガードの内側に置くという考えがあります。
このようにして、ヘッダーを任意の順序で含めることができます。おそらく、循環依存関係は問題になりません。
では、宣言を外部に置くことができるのに、なぜヘッダー全体をガード トークンで保護するのでしょうか?
私の根拠は次のとおりでした。
2 つのヘッダーが何らかの形で相互に参照している場合、問題が発生することがよくあります。通常、宣言されていないシンボルエラーが発生し、最初の反射は必要なヘッダーを含めることです。しかし、2 つのヘッダーがたまたまお互いに含まれていると、不可解なエラーが発生します。
ああ:
bh
b.cpp に bh を含めると、ah で B が宣言されていないが、ヘッダーが含まれているというエラーが表示されます。(それはwtfの瞬間です。)
これは、ヘッダー ガードがネストされないためです。
宣言をガードの外に置くと、これを防ぐことができます。
ここでは問題ありません。
更新: ヘッダー インクルージョンをガードに入れます (申し訳ありませんが、間違いでした)。
c - Cの「ifndef」と「if !defined」の違いは?
同じ C ソース ファイルで#ifndef ABCと を確認しまし た。#if !defined (ABC)
それらの間に微妙な違いはありますか?(それがスタイルの問題である場合、なぜ誰かが同じファイルでそれらを使用するのでしょうか)
r - source()Rコードが複数回含まれるのを防ぐにはどうすればよいですか?
Rソースファイルがたくさんあります。たとえば、A.RとC.Rファイルの両方で、B.Rはを介してロードされsource()ます。A.Rとの両方の機能を使用したいのですが、繰り返しC.Rソーシングを回避するにはどうすればよいですか?B.RC / C ++に似たインクルードガードメカニズムはありますか?
c++ - '-'トークンの前にunqualified-idが必要です
私は奇妙な状況に遭遇しました。私の理解では、すべての.hファイルに#ifndef #define #endifフラグを設定した場合、インクルードヘッダーファイルの順序はそれほど重要ではありません。
古いコードああ
a.cc
そして、上記のコードは正常に機能しました。
今、私は新しいヘッダーbhを追加しました
bh
新しいa.cc
上記のa.ccは正常にコンパイルされました。ただし、a.ccをに変更すると
新しいa.ccバージョン2
コンパイルはエラーで失敗しました:'-'トークンの前にunqualified-idが必要です。
申し訳ありませんが、小さな例では同じエラーを再現できません。コンパイルエラーにより、大きなプロジェクトが発生しました。そして、上記のように作成された小さな例でテストした場合。コンパイルされましたが、プロジェクトに戻ると。#includeディレクティブの順序は重要です。この問題がどこで発生するかわかりません。誰でも私に手がかりを与えることができれば非常に役に立ちます。前もって感謝します
【解決済み】自分で問題を解決しました。それでも、他の人もそれにこだわっているかもしれないと思います。問題の原因は次のようなものでした。
test.ccで
これらの2行を入れ替えるとコンパイルされます
私が述べたように、'-'トークンの前にunqualified-idが予想されるエラーでコンパイルされます。
c++ - C++ のインクルード ガードの #ifndef 構文
私は現在、CS コースの最終試験のために勉強していて、C++ #ifndef の構文に関するマイナーな (おそらくメジャーな?) 問題に遭遇しました。
#infndef を #include ガードとして使用する場合の構文を見てきましたが、Web 上のほとんどは次のように言っているようです。
しかし、私のクラスのチュートリアル スライドでは、例を次のように示しています。
私は、2つの違いが(もしあれば)何であるか疑問に思っていました。試験では #include ガードを書くように求められる可能性が高く、教授や家庭教師の言うことに従うのが一般的な通念であることはわかっていますが、コンパイル中に違いがある場合は知りたいです。
c - C構造体のメンバーを複数回定義できないのはなぜですか?
構造体のメンバーを複数回宣言することに対するCの規則は、警備員を含めることが必要である主な理由であるように私には思えます。「header.h」に次のものがある場合:
また、ファイル「ah」#includeのheader.hの場合、struct sが2回定義されているため、「ah」と「header.h」の両方を含めることはできません。
私の質問は、これを行うことの問題は何ですか?構造体の複数の同一の定義を許可できないのはなぜですか?これにより、インクルードガードが不要になり、Cヘッダーファイルが大幅にクリーンアップされます。
Cの規則では、複数の宣言が許可されていますが、定義は1つだけです。何らかの理由で、構造体のメンバーを指定することは、変数や関数を定義していなくても、「定義」と呼ばれます。
c++ - 「#pragma once」はエラーを引き起こす可能性がありますか?
私のヘッダーファイルはすべてインクルードガードとpragma onceを使用しています:
pragma onceは標準ではなく、コンパイラ間で同じではない可能性があることは理解していますが、それが原因でエラーが発生する可能性はありますか? 最初に利用可能かどうかを何らかの方法でテストしたほうがよいでしょうか?
コンパイラ間の互換性を維持しながら、コンパイルを高速化し、名前の衝突を回避するオプションとしてpragma onceを提供したいと考えています。
c - 標準のヘッダー/ライブラリにガードが含まれていますか?
実際stdlib.h、プログラムの各ファイルにインクルードしても、再定義エラーは発生しません。だから、答えはイエスです。右?
私はlibxml2ソースコードを読んでいます、そしてHTMLparser.cそこにこの部分があります:
私の質問は:なぜinclude guardsここで使うのですか?