首页 > 后端开发 > C++ > 为什么头文件中出现'多重定义”错误,如何修复它们?

为什么头文件中出现'多重定义”错误,如何修复它们?

Patricia Arquette
发布: 2024-11-27 06:31:14
原创
170 人浏览过

Why Do I Get

头文件中的多个定义错误:为什么以及如何解决它们

编译器在出现多个定义时会遇到“多个定义”错误同一程序中符号的定义。当多个源文件包含相同的头文件,并且每个头文件定义相同的符号时,就会发生这种情况。

让我们检查一下提供的代码示例:

// complex.h
#include <iostream>

class Complex {
public:
   Complex(float Real, float Imaginary);
   float real() const { return m_Real; };
private:
   friend std::ostream&amp; operator<< (std::ostream&, const Complex&);
   float m_Real;
   float m_Imaginary;
};

std::ostream&amp; operator<< (std::ostream&amp; o, const Complex& Cplx) {
   return o << Cplx.m_Real << " i" << Cplx.m_Imaginary;
}
登录后复制

运算符

// complex.cpp
#include "complex.h"
Complex::Complex(float Real, float Imaginary) {
   m_Real = Real;
   m_Imaginary = Imaginary;
}
登录后复制
// main.cpp
#include "complex.h"
#include <iostream>
int main() {
   Complex Foo(3.4, 4.5);
   std::cout << Foo << "\n";
   return 0;
}
登录后复制

编译此代码时,编译器遇到“多重定义”错误对于操作员

为什么不使用 real()?

real() 成员函数是隐式内联的,这意味着编译器将其视为内联函数,即使它被声明为内联函数.h 中没有明确指定

解决方案

解决运算符的多重定义问题

内联函数:
将 inline 关键字添加到函数定义中以指示编译器内联它:

inline std::ostream&amp; operator<< (std::ostream&amp; o, const Complex& Cplx) {
   return o << Cplx.m_Real << " i" << Cplx.m_Imaginary;
}
登录后复制

将定义移至.cpp 文件:
删除函数定义从 .h 文件中将其放入相应的 .cpp 文件中:

// complex.cpp
std::ostream&amp; operator<< (std::ostream&amp; o, const Complex& Cplx) {
   return o << Cplx.m_Real << " i" << Cplx.m_Imaginary;
}
登录后复制

其他解决方案

其他解决方案包括:

  • Pragma Once: 在 .h 文件中使用预处理器指令来抑制多个包含。
  • 模块系统: 使用模块系统(C 20 及以上)处理源文件之间的依赖关系。
  • 标头防护:确保 .h 文件定义唯一的宏以防止多次包含。

以上是为什么头文件中出现'多重定义”错误,如何修复它们?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板