C は人気のあるプログラミング言語ですが、使用中に「未定義の参照」というコンパイルエラーが頻繁に発生し、プログラム開発に多大な支障をもたらします。この記事では、「未定義の参照」エラーの解決策を原因と解決策の両方から説明します。
1. エラーの原因
C コンパイラがソースファイルをコンパイルするとき、コンパイル段階とリンク段階の 2 つの段階に分かれます。コンパイル フェーズでは、ソース ファイル内のソース コードがアセンブリ コードに変換され、リンク フェーズでは、さまざまなソース ファイルが実行可能ファイルに結合されます。
ここでは、宣言と定義という 2 つの概念を区別する必要があります。宣言とは、プログラム内で変数または関数の存在を宣言し、その名前、型、パラメータ リスト、その他の情報をコンパイラに伝えることを指します。定義は、変数または関数に記憶領域を割り当て、実装コードを与えることです。プロジェクトでは宣言と定義がまとめられていないと「参照が未定義」というコンパイルエラーが発生する場合があります。
具体的には、このエラーの主な理由は次のとおりです。
ヘッダー ファイルについては、プログラムの堅牢性と可読性を高めるために、通常、ヘッダー ファイル保護 (#ifndef および #define で定義される条件付きコンパイル命令) が追加されます。ただし、ヘッダー ファイルが複数回インクルードされると、コンパイラは「複数定義」エラーをスローします。この問題を解決するためにヘッダファイル保護機構が導入されましたが、ヘッダファイル保護機構の使い方を誤ると「未定義参照」というコンパイルエラーが発生する可能性もあります。
コンパイラがリンク フェーズ中に未定義の関数を見つけられない場合、「未定義」というエラーが表示されます。通常、これは、対応するライブラリ ファイルまたはリンク ライブラリ ファイルが見つからないことが原因です。
プログラム内で関数または変数が定義されていない場合、「参照が定義されていません」というエラーが発生します。
2. 解決策
ヘッダー ファイルが複数回インクルードされることを避けるために、ヘッダー ファイル保護を使用できます。機構。次のコードをヘッダー ファイルに追加するだけです:
#ifndef _HEADER_FILE_NAME_H_ #define _HEADER_FILE_NAME_H_ //..头文件内容 #endif
このうち、_HEADER_FILE_NAME_H_ は、異なるヘッダー ファイルを区別するために他の識別子に置き換えることができます。これにより、ヘッダファイルの繰り返しの宣言と定義が回避され、「未定義の参照」によるコンパイルエラーが解消されます。
プログラムのコンパイル時に特定のライブラリ関数またはリンク ライブラリ ファイルが使用される場合、これらのライブラリ ファイルは、コンパイル中に使用可能なリンクにリンクされる必要があります。実行可能ファイル内のリンクフェーズ。 Windows プラットフォームの場合、コマンド ラインで次のコマンドを使用してリンクできます。
g++ main.cpp -o main.exe -l library_name
その中で、-l の後に、リンクする必要があるライブラリ ファイルの名前が続きます。 Linux プラットフォームの場合、コマンド ラインで次のコマンドを使用してリンクする必要があります。
g++ main.cpp -o main -l library_name
同様に、-l の後には、リンクする必要があるライブラリ ファイルの名前が続きます。 「未定義の参照」エラーが発生した場合、必要なライブラリファイルがリンクされているか、パスが正しいか確認できます。
「未定義の参照」エラーが発生する場合は、通常、対応する宣言と定義がプログラム内に見つからないことが原因です。 。この問題を解決するには、すべての宣言と定義がプログラムに含まれていることを確認して、プログラムが正常にコンパイルされることを確認します。
要約すると、「未定義の参照」エラーが発生する場合は、通常、ヘッダー ファイルが複数回インクルードされているか、リンク ライブラリ ファイルがリンクされていないか、プログラム内の関数や変数が正しくないことが原因です。定義されています。したがって、このエラーが発生しないようにするには、プログラムの宣言と定義を注意深く確認し、問題が発生している箇所を指摘する必要があります。実際のプログラミングでは、常にこのエラーに注意を払い、時間内に問題を特定して解決し、プログラムの正確さと正常な動作を保証する必要があります。
以上がC++ コンパイル エラー: 未定義の参照、解決方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。