无法弄清楚这个错误的含义

时间:2017-05-24 05:07:04

标签: c++ oop

Error   2   error LNK2005: "void __cdecl strCpy(char * &,char * &)" 

(?strCpy@@YAXAAPAD0@Z) 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

1 个答案:

答案 0 :(得分:0)

问题:标题

中的非静态全局命名空间函数定义

问题是您在标头中定义strCpy,并为Honda.obj和Car.obj多次包含它,因为您在两个.cpp文件中都包含str.h。

由于函数未声明为static,因此它不会被实例化一次,但是对于每个.OBJ中的str.h的每个包含,并且链接器将遇到strCpy()的多个定义。

解决方案1:标记strCpy static

#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>