2

LNK2005、LNK1169 エラー、"int __cdecl g(void)" (?g@@YAHXZ)と同様の問題が既に定義されていると思いますが、問題が見つかりません。

私はVisual Basicで作業しており、次のファイルを持っています

main.cpp

#include <iostream>
#include "functions.h"
using namespace std;

int main(){
    number();
    return 0;
}

私は持っていましたが、関数functions.cppの名前を変更する前にリンクした質問を読んだ後、

int number(){
    int i = 1;
    return i;
}

表示されるようになりました error LNK2005: "int __cdecl number(void)" (?number@@YAHXZ) already defined in functions.obj

の機能number()に問題はありfunctions.hますか?

4

3 に答える 3

5

リンクの問題が発生しています。

あなたの差し迫った問題は、functions.objリンクされているコードが含まれていることです。次に、それらが衝突するように再定義number()します。main.cpp先に進み、プロジェクトをクリーンアップします (これにより が削除functions.objされ、コンパイルできるはずです。ただし、この方法で行うことをお勧めします。

functions.hpp (または functions.h)

int number();

関数.cpp

int number(){
    int i = 1;
    return i;
}

main.cpp

#include <iostream>
#include "functions.h"
using namespace std;

int main(){
    number();
    return 0;
}

コンパイルすると、プログラムはコンパイルされたコードfunctions.objで と の2 つのオブジェクトを作成しますmain.obj。メインファイルで使用するためnumber、コンパイラはその関数の実装を探します。その関数の実装はfunctions.objオブジェクトにあるため、それをリンクする必要があります。

複数の C++ ファイルで使用する場合は、常にコードを独自のファイルと実装に分離する必要があります。number()

于 2013-08-02T16:10:19.593 に答える
2

functions.h は、次のように関数のみを宣言する必要があります。

int number();

functions.cpp には関数定義が含まれている必要があります

int number(){
    int i = 1;
    return i;
}

もちろん functions.cpp をコンパイルする必要があります (プロジェクトに追加します)。

ここでの問題は、複数のファイルに functions.h を含めていることです。staticこの問題は、関数を次のように宣言するだけでも回避できます。

static int number(){
    int i = 1;
    return i;
}

ただし、学習しているように見えるので、C++ コードのコンパイルの基本を学習することをお勧めします。

于 2013-08-02T16:09:33.620 に答える
0

リンクするモジュールの 1 つに、 という名前の関数がありますnumber()。独自の実装を定義して、リンカーがどれを使用するかを認識しないようにします。

関数の名前を変更するか、名前空間を使用してください。

于 2013-08-02T16:11:20.193 に答える