問題タブ [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 - ヘッダーガードを 1 に定義する理由はありますか?
時折、次のようなヘッダー ガードを観察します。
しかし、私は次のように学びました。
古い遺物への定義は、1
いくつかのコンパイラに影響しますか?、それは最近害を及ぼしますか? それを今行う方法は何ですか?
cmake - (クロスコンパイル) プラットフォーム ファイルにはインクルード ガードが必要ですか?
VxWorks 用のクロスコンパイル ツールチェーン ファイルを作成しています。cmake は不明なシステムであるため、プラットフォーム ファイル ( にあるもの../Modules/Platform
) も書き込みます。
ツールチェーンファイルの他に、これまでに次のプラットフォーム ファイルを作成しました。
- VxWorks.cmake (VxWorks OS 設定)
- VxWorks-gcc.cmake (WindRiver (Gnu) コンパイラの設定)
- VxWorks-gcc- [CPU] .cmake (CPU 固有の設定、ツールチェーン ファイルで指定されているプロセッサ)
現時点では、すべてが私のファイルで正常に動作しています。
ただし、デフォルトのプラットフォーム ファイルの一部には、次のようなインクルード ガード /インクルード ブロッカーが含まれています。
(から: Modules/Platform/Windows-GNU.cmake
)
だから私は疑問に思っています:私もそのようなガードを挿入する必要がありますか? そして、いつそれらを挿入するのが良い考えですか?
c - C にガード規則を含める
インクルードガードを設定する従来の方法は何ですか? 私は通常、それらを次のように記述します(例:.h):
アンダースコアの規則は重要ですか? これをグーグルで検索すると、矛盾する情報が表示されました。_EXAMPLE_H_
ヘッダーの名前と一致する必要がありますか?
c - ifndef は、空の置換リストで定義されたオブジェクトのようなマクロで常に機能しますか?
ヘッダー ファイルのインクルード ガードは、コードのセクションを二重インクルードから保護するためによく使用されます。
通常、インクルード ガードは、オブジェクトのようなマクロが既に定義されている場合、ブロック内の行がインクルードされないという期待に依存しています#ifndef
。したがって、二重インクルードを回避します。
#define
多くのインクルード ヘッダーの行に空の置換リストがあることに気付きました。C99 標準は、空の置換リストで定義されたオブジェクトのようなマクロが によって「定義された」と見なされることを保証します#ifndef
か?
の構文を説明するとき、C99 標準は、セクション 6.10.3 パラグラフ 9#define
で replacement-list が必要であることを暗示しているようです。
フォームの前処理ディレクティブ
# 識別子置換リストの改行を定義
マクロ名の後続の各インスタンスを、ディレクティブの残りの部分を構成する前処理トークンの置換リストに置き換える、オブジェクトのようなマクロを定義します。次に、以下に指定されているように、置換リストを再スキャンして、さらに多くのマクロ名を探します。
これは、代わりにインクルード ヘッダーを次の形式にする必要があることを意味します#define FOOBAR_H 1
か?
c - ヘッダー ファイル内のグローバル変数が原因でリンク エラーが発生するのはなぜですか?
ヘッダー ファイルにインクルード ガードを配置しても、常に次のエラーが発生します。
.h ヘッダー ファイル、.c ファイル、および main.c は次のとおりです。
main.c
Handshake.h
Handshake.c
しかし、ヘッダー ファイルからグローバル変数を削除すると、これらのコードは正常にコンパイルされます。
理由がわかりません。誰かが理由を説明できますか?前もって感謝します。
c - 2つのファイルに同じファイルを含めてから別のファイルに含めるとエラーが発生する (c)
解決方法がわからない C の問題があります。4 つの c ファイル ac があるとします。紀元前; cc; dc であり、それぞれに .h ファイルがあります。bh ; チャンネル; dh、もちろん含まれています。私は次のことをしたい:
ああ、含まれます:
bh には以下が含まれます。
ch には以下も含まれます。
dh で構造体を定義します。たとえば、dh の内容は次のようになります。
問題は、エラーが発生することです(ファイルをコンパイルすると):
なぜそれが起こっているのか理解しています(プリプロセッサが定義を2回インポートするため)が、どうすれば解決できますか?インクルードをそのようにする必要があります(もちろん、もっと多くのファイルがあるため、これは単なる例です)。私に何ができる?
注:私のメイクファイルは:
大丈夫だと思います..それは私にとってはうまくいきました。お手伝いありがとう。
c - インクルード ガードがまだグローバル変数を挿入している
プロジェクト (Visual Studio) に3 つの*.c
ファイル ( file1.c
、file2.c
およびfile3.c
) と 1 つの*.h
ファイル ( ) があります。file3.h
VSでソリューションをビルドすると、エラーが発生し"_gintVariable already defined in file1.obj"
ます。
プリプロセッサの出力を確認しました。インクルード ガードを含めたにもかかわらず、すべての *.c ファイルに gintVariable が含まれています。
私がしている間違いは何ですか?
c++ - Forward Declaration?、Include Guard?、またはその他の何か?
Tokenという親クラスがあります
ErrorToken と EndToken の 2 つの子クラスがあります。 これらのクラスのそれぞれが、他の のオブジェクトを作成し、関数呼び出しを介してそれを返すことができる必要があります。それぞれに独自の個別のヘッダー クラスがあります。
したがって、ErrorToken は新しい EndToken オブジェクトを作成して返すことができる必要があり、EndToken は新しい ErrorToken オブジェクトを作成して返すことができる必要があります。
これを成功させる最善の方法は何でしょうか? プラグマを一度も使用したくないので、可能な限りクロスコンパイラ互換であることが望ましいです。(しかし、それは本質的に私が探しているものです)。
理想的には、このようなことができるようになりたいのですが...
しかし、それは決してうまくいかないようです(私の推測では、それは間違っていると思いますか?誰かが理由を理解するのを手伝ってくれますか?)。
前方宣言の私の理解は、それが関数のシグネチャとポインターでのみ機能するということです(それは正しいですか?)、コンストラクターを実行できるようにするために必要なので、私の状況では機能しないと思います...または機能しますコンパイラは、コンストラクタがその時点で終了することを認識する必要があるだけですか?