为什么C ++代码有时会编译,有时会根据以前的编译给出编译错误?

时间:2019-04-17 04:50:48

标签: c++ visual-c++ constructor compiler-errors destructor

我正在学习C ++中的构造函数,但是MSVS编译器的行为很奇怪,我也不明白为什么。编译器的成功似乎取决于最近的编译尝试。我的期望是,如果我的代码成功编译一次,则它应该始终成功编译,并且如果给出错误,则应该始终给出错误。对于我的代码,情况并非如此。我在Windows 10的免费MSVS 2019 IDE中使用调试器。

我有3个文件构成了我的项目,并且将我称为A,B和C的项目有3个不同版本。

版本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的构造函数中声明了happy的一个更改,从而使happy成为构造函数的局部变量。 / p>

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的构造函数中初始化happy。然后,如果我将版本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版并返回即可解决该问题。

0 个答案:

没有答案