首页 > 解决方案 > C ++中的重复符号函数

问题描述

main()我在 Hello.cpp 中有以下函数调用

#include "HelloWorld.cpp"

int main(){
HelloWorld helloWorld;
helloWorld.printHelloWorld();
return 0;
}

包含的另一个 c++ 文件具有以下代码。

#include <iostream>
#include <string>

class HelloWorld{
        public:
        void printHelloWorld();
};

void HelloWorld::printHelloWorld() {
    std::cout << "This is the world" << std::endl;
}

当我使用 Xcode 执行时,我看到printHelloWorld.

duplicate symbol 'HelloWorld::printHelloWorld()' in: Hello.o HelloWorld.o

ld: 1 duplicate symbol for architecture x86_64

如何解决上述问题?

标签: c++xcode

解决方案


您的文件结构错误。

非定义声明属于头文件(.h.hpp按约定结束):

// HelloWorld.h

// No standard library headers required, because you don't use anything from `std::`

class HelloWorld{
    public:
    void printHelloWorld();
};

(非内联)定义属于源文件(或.cpp按约定):.cxx.cc

// HelloWorld.cpp

#include "HelloWorld.h"

#include <iostream>
// #include<string> is not needed, since you don't use `std::string` here

void HelloWorld::printHelloWorld() {
    std::cout << "This is the world" << std::endl;
}

并且源文件不应包含在其他文件中。只应包含带有声明的头文件:

#include "HelloWorld.h"

int main(){
    HelloWorld helloWorld;
    helloWorld.printHelloWorld();
    return 0;
}

每个源文件按照惯例编译为单独的翻译单元,并且可能仅在一个翻译单元中定义(非内联)函数

#include基本上只是将代码从另一个文件复制粘贴到使用它的文件中。因此,如果您.cpp在另一个.cpp文件中包含定义,那么这两个文件的两个翻译单元都.cpp将包含该定义,这违反了上面提到的一个定义规则。

您的错误是告诉您HelloWorld::printHelloWorld()在两个翻译单元中有(不是内联的)定义。


推荐阅读