c++ - 为什么 C++ 代码有时会编译,有时会根据之前的编译给出编译错误?
问题描述
我正在学习 C++ 中的构造函数,但 MSVS 编译器的行为很奇怪,我不明白为什么。编译器的成功似乎取决于最近的编译尝试。我的期望是,如果我的代码成功编译一次,它应该总是成功编译,如果它出错,它应该总是出错。使用我的代码,情况并非如此。我在 Windows 10 上的免费 MSVS 2019 IDE 中使用调试器。
我有 3 个文件构成我的项目,以及项目的 3 个不同版本,我将分别称为 A、B 和 C。
版本 A是下面前三个显示中显示的代码。我认为版本 A 应该按我的预期编译和运行。版本 A 中的任何实际错误都可能是这个问题的次要问题。代码应该定义一个类,创建类的实例(运行构造函数),调用类的方法,最后在程序终止时调用该对象的析构函数。
以下代码位于 Cat.h 中。
#pragma once
#include <iostream>
class Cat {
private:
bool happy;
public:
Cat();
~Cat();
void meow();
};
以下在文件 Cat.cpp 中。
#include <iostream>
#include "Cat.h"
Cat::Cat() {
std::cout << "Creating Cat" << std::endl;
happy = false;
};
Cat::~Cat() {
std::cout << "Deleting Cat..." << std::endl;
};
void Cat::meow() {
if (happy) {
std::cout << "Meow" << std::endl;
}
else
{
std::cout << "SSSSSsssss" << std::endl;
}
return;
};
以下是我的主要文件。
#include "Cat.h"
int main() {
Cat cat;
cat.meow();
}
版本 B与版本 A相同,除了在 Cat 的构造函数中声明了快乐的一个变化,使快乐成为构造函数的局部变量。
Cat::Cat() {
std::cout << "Creating Cat" << std::endl;
bool happy = false;
}
版本 C与版本 A相同,除了明显的错误,即在 Cat.h 中的类声明之后删除了分号。
Cat();
~Cat();
void meow();
}
现在是奇怪的行为。
如果我第一次尝试编译版本 A,我会收到以下错误:
1>Debug\Cat.obj : warning LNK4042: object specified more than once; extras ignored
1>Source.obj : error LNK2019: unresolved external symbol "public: __thiscall Cat::Cat(void)" (??0Cat@@QAE@XZ) referenced in function _main
1>Source.obj : error LNK2019: unresolved external symbol "public: __thiscall Cat::~Cat(void)" (??1Cat@@QAE@XZ) referenced in function _main
1>Source.obj : error LNK2019: unresolved external symbol "public: void __thiscall Cat::meow(void)" (?meow@Cat@@QAEXXZ) referenced in function _main
如果我现在将版本 A更改为版本 B并编译,我不会收到任何错误,但我在 cat 的构造函数中初始化不开心。如果我随后将版本 B更改回版本 A,代码将按我的预期编译和运行。
现在版本 A编译并运行,即使它与之前给我错误的代码相同。
如果我现在将版本 A更改为版本 C并编译,我会得到明显的错误:
1>Cat.cpp
error C2533: 'Cat::{ctor}': constructors not allowed a return type
1>Cat.h
fatal error C1004: unexpected end-of-file found
如果我现在将此版本 C更改为版本 A并进行编译,我会得到与版本 A的初始编译相同的错误。恢复到版本 B并返回解决了这个问题。
解决方案
推荐阅读
- mysql - 在同一列中选择与 CPC 代码相关联的 ID
- reactjs - 如何将一个简单的 HTML 页面拆分为多个 React 组件并共享状态?
- elasticsearch - Logstash 在集群期间关闭
- html - 试图通过悬停放大图像
- html - 为什么继承box sizing css reset而不是将其直接应用于所有元素?
- python - AttributeError:部分初始化的模块“cv2”没有属性“CascadeClassifier”(很可能是由于循环导入)
- reactjs - 如何使引导程序 4 容器中的行总高度等于列高
- machine-learning - 使用相似时间序列估算时间序列
- reactjs - 如何在 react-beautiful-dnd 中禁用一项的可拖动属性
- css - 使 Div 出现在圣诞节前后