c++ - 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
如何解决上述问题?
解决方案
您的文件结构错误。
非定义声明属于头文件(.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()
在两个翻译单元中有(不是内联的)定义。
推荐阅读
- javascript - Uncaught SyntaxError: missing ) 在参数列表之后,即使代码是正确的
- python - 用 Python 包装 C++ - 返回引用
- c# - 访问部分类中虚拟类的属性
- r - 用 hexSticker 修剪六边形?
- db2 - 如何确定 db2secGetAuthIDs 中 initsessionidtype 的正确返回
- angular - 如何成功处理错误和成功消息?
- json - Errno::EACCES: 权限被拒绝 @ rb_sysopen
- python - 如何用 0 替换 NULL
- asp.net-core - ASP.Net Core - 访问被拒绝的 EC2 到 S3 文件上传
- javascript - D3:它没有显示美国地图