为什么#define会在标头中引起问题?

时间:2019-05-01 08:42:19

标签: c++

我直到最近才开始使用C ++,并尝试使用不同的文件(主要文件,标头文件和实现文件)构建一个简单的类。这样做时,我遇到了#ifndef / #define的一个非常奇怪的问题(至少对我而言)。我将首先显示代码:

// main.cpp :
#include <iostream>
#include "daytime.h"

using namespace std;

int main(int argc, char** argv) {
    DayTime sT = DayTime(75);
    cout << sT.getMin();

    return 0;
}

// daytime.h :
#ifndef DayTime
#define Daytime

class DayTime
{
    int min;

    public:
        DayTime(int min);
        int getMin();
        int getHour();
};

#endif

// daytime.cpp :
#include "daytime.h"

DayTime::DayTime(int min)
    : min(min) {}

DayTime::getMin()
{
    return this->min;
}

DayTime::getHour()
{
    return int (this->min / 60);
}

如您所见,#define Daytime的{​​{1}}中有一个错字-'time'用小写的't'书写。这是奇怪的部分:只要错字,程序就可以编译并运行而不会出现问题。但是,当我将其更正为daytime.h(大写字母'T')后,它不再符合要求,并且出现了很多错误:

#define DayTime

到目前为止,我已经在这个问题上浪费了很多时间,但是我总是回到同一个问题上:错字在那里,它起作用了,错字消失了,没有了-我只是不明白。因此,我非常感谢您在这里提供的帮助。

1 个答案:

答案 0 :(得分:3)

#define DayTime导致DayTime以后出现的任何内容都替换为空字符串。

因此class DayTime中的类名(及其构造函数)被删除,从而导致问题:编译器有效地看到:

class
{
    int min;

    public:
        (int min);
        int getMin();
        int getHour();
};

通常由于这个确切的原因,当人们使这些人包括守卫时,他们使用的东西不太可能显示为真实标识符。例如:

#ifndef DAYTIME_H
#define DAYTIME_H

class DayTime {
  // blah blah blah
};

#endif