ホームページ > バックエンド開発 > C++ > C++ コンパイル エラー: ヘッダー ファイルが複数回参照されています。解決方法は?

C++ コンパイル エラー: ヘッダー ファイルが複数回参照されています。解決方法は?

PHPz
リリース: 2023-08-21 20:25:42
オリジナル
2625 人が閲覧しました

C コンパイル プロセス中に、ヘッダー ファイルが複数回参照されるというエラーが頻繁に発生します。このエラーは、ヘッダー ファイルが複数の場所で参照されている場合、その内容がそれぞれの場所にコピーされるため、コンパイラがそれらのファイルをリンクするときに重複定義エラーが発生します。

このエラーが発生した場合は、次の解決策を実行できます。

1. プリコンパイル済みヘッダー ファイルを使用する

まず、プリコンパイル済みヘッダー ファイル (PCH) を使用すると、このエラーを回避できます。 PCHは、よく使うヘッダファイルをあらかじめコンパイルしておくことで、同じヘッダファイルが複数参照される問題を回避できる技術です。 PCH を使用するには、いくつかのコンパイラ オプションを設定する必要があります。詳細については、コンパイラのドキュメントを参照してください。

2. ヘッダー ファイル保護を使用する

もう 1 つの解決策は、ヘッダー ファイル保護 (ヘッダー ファイル ガード) を使用することです。ヘッダー ファイルの保護とは、同じヘッダー ファイルが複数回参照される問題を回避するために、ヘッダー ファイルにプリプロセッサ ディレクティブを追加することを指します。ヘッダー ファイルの保護形式は次のとおりです。

#ifndef HEADER_FILE_NAME
#define HEADER_FILE_NAME

// 头文件内容

#endif
ログイン後にコピー

このうち、HEADER_FILE_NAME は、このヘッダー ファイルを一意に識別するための任意の識別子に置き換えることができます。コンパイラがこのヘッダー ファイルを初めて検出したときは、HEADER_FILE_NAME を定義してからヘッダー ファイルをコンパイルします。コンパイラがこのヘッダー ファイルを 2 回目に検出したときは、HEADER_FILE_NAME であるため、ヘッダー ファイルをコンパイルします。が定義されている場合、コンパイラはこのファイルを直接スキップします。これにより、同じヘッダー ファイルが複数回定義される問題を回避できます。

3. #pragma Once を使用する

ヘッダー ファイルの保護に加えて、C では、ヘッダー ファイルが複数参照される問題を回避するための #pragma Once の使用もサポートしています。回。 #pragma Once は、ヘッダー ファイルが 1 回だけコンパイルできることをマークするために使用される特別なプリプロセッサ ディレクティブです。 #pragma Once を使用する形式は非常に簡単です。ヘッダー ファイルの先頭に次の命令を追加するだけです:

#pragma once

// 头文件内容
ログイン後にコピー

コンパイラがこのヘッダー ファイルを初めて検出したとき, このファイルのパスとファイル名は記録され、コンパイル済みファイルとしてマークされます。コンパイラーがこのヘッダー ファイルを 2 回目に検出すると、まず以前にコンパイルされたことがあるかどうかを確認し、コンパイルされている場合は、直接渡された場合はジャンプします。それ以外の場合はコンパイルを続行します。 #pragma Once を使用すると、ヘッダー ファイル保護の構文が簡素化され、コンパイル速度が向上します。

つまり、PCH、ヘッダー ファイル保護、#pragma Once のいずれを使用しても、同じヘッダー ファイルが複数回参照されるエラーを効果的に回避できます。実際のプログラミングでは、ヘッダー ファイルへの繰り返しの参照を避け、このエラーを回避する適切な解決策を選択する必要があります。

以上がC++ コンパイル エラー: ヘッダー ファイルが複数回参照されています。解決方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート