我直到最近才开始使用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
到目前为止,我已经在这个问题上浪费了很多时间,但是我总是回到同一个问题上:错字在那里,它起作用了,错字消失了,没有了-我只是不明白。因此,我非常感谢您在这里提供的帮助。
答案 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