gpt4 book ai didi

c++ - 尽管#ifndef,头文件包含两次

转载 作者:行者123 更新时间:2023-11-30 03:53:58 27 4
gpt4 key购买 nike

<分区>

我有一个重载了 << 运算符的类 Angle 和两个包含头文件的 cpp 文件。我有一个 #ifndef 语句来防止文件被多次包含。但是,它似乎被多次包含,因为我收到一个错误,即运算符 << 被多次定义。然后我添加了一个#warning 语句来查看文件何时被包含。在编译器输出中可以看到 #warning 被处理了两次。如果我将定义移动到 cpp 文件中,它显然可以工作,但我仍然觉得这种情况下的行为很奇怪。

在我看来,编译器不应该处理头文件两次。这种行为有原因吗?

main.cpp

#include <iostream>
#include <cmath>
#include <cstdlib>
#include "Angle.h"
using namespace std;

int main() {
Angle a = (Angle)(M_PI/4);
cout << a << endl;
return EXIT_SUCCESS;
}

角度.h

#ifndef ANGLE_ANGLE_H
#define ANGLE_ANGLE_H
#include <iostream>

class Angle {
private:
double value;
public:
explicit Angle (double value) {this->value = value; }
double getValue() const {return this->value;}

// Operators
operator const double() const {
return this->value;
}
};

#warning INCLUDING_ANGLE_H

std::ostream& operator << (std::ostream& os, const Angle& obj){
os << obj.getValue();
return os;
}
#endif //ANGLE_ANGLE_H

角度.cpp

#include "Angle.h"

我正在使用以下命令进行编译:

g++ main.cpp Angle.cpp -o angle

出现以下错误:

In file included from main.cpp:5:0:
Angle.h:19:2: warning: #warning INCLUDING_ANGLE_H [-Wcpp]
#warning INCLUDING_ANGLE_H
^
In file included from Angle.cpp:1:0:
Angle.h:19:2: warning: #warning INCLUDING_ANGLE_H [-Wcpp]
#warning INCLUDING_ANGLE_H
^
/tmp/cci53Hrd.o: In function `operator<<(std::ostream&, Angle const&)':
Angle.cpp:(.text+0x0): multiple definition of `operator<<(std::ostream&, Angle const&)'
/tmp/ccBbwtlD.o:main.cpp:(.text+0x0): first defined here
collect2: error: ld returned 1 exit status

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com