1

ビルド時に次のエラーが発生します。

エラー 5 エラー LNK2005: "int __cdecl numGen(void)" (?numGen@@YAHXZ) は main.obj で既に定義されています エラー 6 エラー LNK1169: 1 つ以上の多重定義されたシンボルが見つかりました

numGen.cc:

#include <stdlib.h>
#include <stdio.h>
#include <time.h>

int numGen()
{
    int rNum;
    srand(time(NULL)); //--Seeds a random number.
    rNum = 1 + (rand() % 100);

    return rNum;
}

main.cc:

#include <iostream>
#include "NumGen.cc"

int main()
{
    std::cout << numGen();
    return 0;
}
4

3 に答える 3

5

C++ ファイルを他の C++ ファイルに含めないでください。これにより、シンボルが二重に定義されます。代わりに、前方宣言を含むヘッダー ファイルを作成し、それを関数を共有する両方のファイルにインクルードし、ファイルを個別にコンパイルする必要があります。

numGen.h:

int numGen();

numGen.h両方のファイルに含めcc、削除し#include "NumGen.cc"ます。

于 2012-12-04T02:43:28.007 に答える
3

ファイルを#includeing することNumGen.ccmain.cc、プリプロセッサに次のような 2 つのファイルを作成させます。

NumGen.cc:

#include <stdlib.h>
#include <stdio.h>
#include <time.h>

int numGen()
{
    int rNum;
    srand(time(NULL)); //--Seeds a random number.
    rNum = 1 + (rand() % 100);

    return rNum;
}

main.cc:

#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <time.h>

int numGen()
{
    int rNum;
    srand(time(NULL)); //--Seeds a random number.
    rNum = 1 + (rand() % 100);

    return rNum;
}

int main()
{
    std::cout << numGen();
    return 0;
}

プリプロセッサ ディレクティブは、インクルードするファイルのコンテンツをインクルードする場所に挿入するだけなので#include(もちろん、以前にインクルードされていて、インクルード ガードでラップされていない限り) 、同じコマンドで両方NumGen.ccをコンパイルしていると仮定しています。したがって、関数が両方のファイルで定義および実装されているmain.cc場合、当然、複数定義されたシンボル エラーが発生します。numGen

あなたがしなければならないことはnumGen、ヘッダーファイルで前方宣言することです。それを呼び出しましょうNumGen.h

int numGen();

#include "NumGen.h"と の両方に行をNumGen.cc入れますmain.cc

于 2012-12-04T02:50:41.537 に答える
1

cc ファイルを含めています。実際のヘッダーのみを含める

于 2012-12-04T02:44:08.077 に答える