2017-05-24 3 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 

Das Projekt auf diesem Link zu finden ist: https://drive.google.com/open?id=0Bw2cO-zFzAvsR1lIdURmbVJMaTAKann nicht die Bedeutung dieses Fehlers herauszufinden

+0

Vermutlich vermissen Sie einen Kopf Wächter eingeschlossen bedeutet, dass Sie strCpy in mehrere Objektdateien geschrieben haben – donkopotamus

+0

@donkopotamus würde ein Header Guard das nicht verhindern, eine Inline-Funktion oder eine separate Definition würde. – Quentin

Antwort

0

Problem: Nicht-statische Funktion Definition global-Namespace im Header

Das Problem ist, dass Sie definieren strCpy in der Kopfzeile, und fügen Sie es mehrmals für Honda.obj und Car.obj ein, da Sie str.h in den beiden entsprechenden .cpp-Dateien enthalten.

Da die Funktion nicht als statisch deklariert ist, wird sie nicht einmal instanziiert, sondern für jede Aufnahme von str.h in jeder der .OBJ separat und der Linker trifft auf mehrere Definitionen von strCpy().

Lösung 1: statische Mark 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'; 
} 

Lösung 2: Separate Erklärung und Definition über .h und CPP-Dateien

// 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'; 
} 

In beiden Fällen:

#pragma once oder hinzufügen Nicht-VS include-guard #ifndef <key> #define <key> // code #endif // <key>

Verwandte Themen