0

Visual Studio プロジェクトに 3 つのファイルがあります:test.cppと-date.cppmain.cpp

test.cpp:

int g() { return 0; }

日付.cpp:

/*totally empty*/

main.cpp:

#include "test.cpp"
#include "date.cpp"

int main() { return g(); }

ヘッダーファイルで関数を定義すると、ヘッダーファイルが複数回呼び出されると、一定義規則違反になることを理解しています。ただし、ここでは、1 つのファイル/翻訳単位から 1 回だけ呼び出しています。なぜまだ LNK2005 を投げているのですか?

4

3 に答える 3

4

と を含めないtest.cppでくださいdate.cpp。代わりに、 and を書き、それを含める必要がtest.hありdate.hます。

test.h

int g();

日付.h

// Contains prototypes for functions inside date.cpp

main.cpp

#include "test.h"
#include "date.h"

int main() { return g(); }
于 2013-04-27T19:32:22.550 に答える
3

「main.cpp」に「test.cpp」を含めています-Visual Studioは「test.cpp」も別のファイルとしてコンパイルし、「test.obj」を「main.obj」にリンクするため、これはおそらく間違っています" (これらはコンパイラによって生成されたファイルです) を "main.exe" にコピーします。次に、「test.obj」と「main.obj」の両方で「g()」が見つかると、「えっ、なぜこれらが 2 つあるのですか」(または、リンカー用語で「複数の定義されたシンボル」) と表示されます。

解決策は、宣言された「test.h」を用意しvoid g();、それを使用して「main.cpp」に含めることです。

于 2013-04-27T19:31:56.187 に答える
2

VS プロジェクトにあるため、プロジェクトから削除するか、「ビルドから除外」に設定するなど、それが起こらないようにする特別な措置を講じない限り、test.cppコンパイルされ、複数の定義が発生するとともに並べられます。main.cpptest.cpp

に名前temp.cppを変更するとtest.h、次の 2 つの利点があります。

  1. .hVS は、ファイルがスタンドアロンでコンパイルされるのではなく、他のファイルからインクルードされることを意図していると想定するため、プロジェクト内にある場合は自動的にコンパイルしません。
  2. ファイルの使用目的についてプログラマーが混乱することが少なくなります。
于 2013-04-27T19:30:58.950 に答える