首页 > 后端开发 > C++ > 为什么在头文件中定义函数会导致 C 中的'多重定义”错误?

为什么在头文件中定义函数会导致 C 中的'多重定义”错误?

Linda Hamilton
发布: 2024-11-19 07:00:03
原创
968 人浏览过

Why Does Defining a Function in a Header File Cause a

为什么要在头文件中多重定义符号?

当尝试编译具有多个头文件的 C 程序时,可能会遇到错误“多重定义 [符号” ]。”当同一符号(例如函数或变量)在代码中定义多次时,就会出现此错误。

请考虑以下示例:

// complex.h
#ifndef COMPLEX_H
#define 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&amp; o, const Complex&amp; Cplx);

   float m_Real;
   float m_Imaginary;
};
#endif // COMPLEX_H

// complex.cpp
#include "complex.h"

Complex::Complex(float Real, float Imaginary) {
   m_Real = Real;
   m_Imaginary = Imaginary;
}
登录后复制
// operator.cpp
#include "complex.h"

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

int main() {
   Complex Foo(3.4, 4.5);
   std::cout << Foo << "\n";
   return 0;
}
登录后复制

编译此代码将导致上述错误。问题源于运算符

与 real() 等公共成员函数不同,real() 是隐式内联的,非成员函数如 operator

要解决此错误,可以:

  • 内联运算符
// complex.h
...
inline std::ostream&amp; operator<<(std::ostream&amp; o, const Complex&amp; Cplx) {
   return o << Cplx.m_Real << " i" << Cplx.m_Imaginary;
}
...
登录后复制
  • 移动运算符
// complex.cpp
...
std::ostream&amp; operator<<(std::ostream&amp; o, const Complex&amp; Cplx) {
   return o << Cplx.m_Real << " i" << Cplx.m_Imaginary;
}
...
登录后复制

通过内联函数或将其定义放在实现文件中,可以避免多重定义错误,确保程序编译成功。

以上是为什么在头文件中定义函数会导致 C 中的'多重定义”错误?的详细内容。更多信息请关注PHP中文网其他相关文章!

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