Cとコンパイルプロセス に関する私の非常に基本的な知識は最近錆びています。次の質問に対する答えを見つけようとしていましたが、コンパイル、リンク、および前処理フェーズの基本を接続できませんでした。グーグルでのクイック検索もあまり役に立たなかった。それで、私は知識の究極の源に来ることに決めました:)
私は知っています:変数は.hファイルで定義されるべきではありません。そこで宣言しても大丈夫です。
理由:ヘッダーファイルが複数の場所からインクルードされる可能性があるため、変数を複数回再定義します(リンカーはエラーを出します)。
考えられる回避策:ヘッダーファイルでヘッダーガードを使用し、その中で変数を定義します。
それは本当に解決策ですか:いいえ。ヘッダーガードは前処理フェーズ用であるためです。これは、この部分がすでに含まれていることをコンパイラーに通知し、再度含まないようにすることです。しかし、複数定義のエラーは、コンパイルのかなり後にリンカー部分で発生します。
このすべてが、前処理とリンクがどのように機能するかについて私を混乱させました。ヘッダーガードシンボルが定義されている場合、前処理にはコードが含まれないと思いました。その場合、変数問題の複数の定義も解決されるべきではありませんか?
これらの前処理ディレクティブにより、コンパイルプロセスがヘッダーガードの下でシンボルを再定義する必要がなくなりますが、リンカーはシンボルの複数の定義を取得します。