一般的に言えば、ac/c++ コンパイラがどのように機能するのかまったくわからないことに最近気づきました。これは当初、ヘッダー ガードを理解しようとしていたことを認めますが、コンパイルのしくみが不足していることに気づきました。
たとえば、Visual C++ を取り上げます。「Header Files」フォルダ、「Resources Files」フォルダ、「Source Files」フォルダがあります。これらのフォルダーを分離し、そこに何を入れることに何か意味はありますか? 私にとって、それらはすべてソース ファイルです。コード スニペットを見てみましょう。
スニペット 1
//a1.h
int r=4;
と
//a1.cpp
int b //<--semicolon left out on purpose
と
//main.cpp
#include <iostream>
#include "a1.h"
void main()
{
cout << r;
}
コンパイラは、「a1.cpp(3) : 致命的なエラー C1004: 予期しないファイルの終わりが見つかりました」と言ってエラーを出します。次のコード スニペット
スニペット 2
//a1.h
int r=4 //<--semicolon left out on purpose
と
//a1.cpp
int b = 4;
と
//main.cpp
#include <iostream>
void main()
{
cout << b;
}
「main.cpp(6) : エラー C2065: 'b' : 宣言されていない識別子」のため、エラーが発生します。a1.cpp をそのように含めると
スニペット 3
//a1.h
int r=4 //<--semicolon left out on purpose
と
//a1.cpp
int b = 4;
と
//main.cpp
#include <iostream>
#include "a1.cpp"
void main()
{
cout << b;
}
コンパイラは、「a1.obj : エラー LNK2005: "int b" (?b@@3HA) は main.obj で既に定義されています」と不平を言います。スニペット 2 と 3 は両方ともint r = 4
、セミコロンが欠落していないという事実を無視しています。これは、xxxx.h ファイルと関係があると思われるためです。スニペット 1 のプロジェクトから a1.cpp ファイルを削除すると、正常にコンパイルされます。明らかに、私が期待していたものは、私が得ているものではありません。cpp でコーディングする方法に関する本やチュートリアルはたくさんありますが、コンパイル プロセスで cpp がファイルやソース コードを処理する方法についてはあまり詳しくありません。ここで何が起こっているのですか?