2017-05-24 17 views
-1
Error 2 error LNK2005: "void __cdecl strCpy(char * &,char * &)" 

([email protected]@[email protected]) already defined in Car.obj 

C:\Users\l1s15bscs0071\Documents\Visual Studio 

2013\Projects\Lab11_task1\Lab11_task1\Honda.obj Lab11_task1 
プロジェクトは、このリンクで見つけることができる

https://drive.google.com/open?id=0Bw2cO-zFzAvsR1lIdURmbVJMaTAは、このエラーの意味を把握することはできません

+0

あなたはおそらく頭が欠けているでしょうあなたはstrCpyを複数のオブジェクトファイルに入れたことを意味するガードをインクルードします。 – donkopotamus

+0

@donkopotamusヘッダーガードはそれを防ぐことはできません。インライン関数や別の定義があります。 – Quentin

答えて

0

問題:ヘッダー内の非静的グローバル名前空間の関数定義

問題は、ユーザーが定義することですstrCpyをヘッダーに追加し、Honda.objとCar.objに複数回追加します。それぞれの.cppファイルにstr.hをインクルードします。

関数は静的であると宣言されていないので、一度インスタンス化されることはありませんが、.OBJのそれぞれにstr.hが含まれるたびに、リンカーはstrCpy()の複数の定義に遭遇します。

解決方法1:マークstrcpyの静的

#include<cstring> 

static void strCpy(char *& Source, char *& Dest) 
{ 
    for (int i = 0; i < strlen(Source); i++) 
    { 
     Dest[i] = Source[i]; 
    } 

    Dest[strlen(Source)] = '\0'; 
} 

解決方法2:両方のケースでの.hと.cppのファイル間で別々の宣言と定義

// str.h 
# pragma once 

void strCpy(char *& Source, char *& Dest); 

// str.cpp 
#include "str.h" 

void strCpy(char *& Source, char *& Dest) 
{ 
    for (int i = 0; i < strlen(Source); i++) 
    { 
     Dest[i] = Source[i]; 
    } 

    Dest[strlen(Source)] = '\0'; 
} 

#pragma onceまたは追加非VS組み込みガード#ifndef <key> #define <key> // code #endif // <key>

関連する問題