首页 > 解决方案 > 为什么 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并返回解决了这个问题。

标签: c++visual-c++constructorcompiler-errorsdestructor

解决方案


推荐阅读