C ++类,关于#ifdef,#define和#endif的混淆

时间:2015-04-04 21:11:47

标签: c++

好的,所以我们在C ++课程中介绍类,在上一课中我们了解到,如果你在同一个文件中#include同一个类多次会发生不好的事情,防止这种情况的方法是使用#头文件中的ifdef,#define和#endif。所以这里只是一个我想写的简单程序,而且由于这些人#,它失败了。似乎#ifdef之后的代码被一个讽刺者忽略了。这里的问题是什么?

这是程序,它由3个文件组成,还要注意我知道没有.h文件程序中的#thing工作正常,而且在这个特定的程序中,我甚至不需要它们。我正在研究需要使用它们的大型项目,他们只是不工作。

谢谢。

==========主文件===========

#include "Circle.h"

int main()
{
    Circle C(5);

    C.output();

    return 0;
}

======== Circle.h文件==========

#ifdef CIRCLE_H
#define CIRCLE_H


#include <iostream>
using namespace std;

class Circle
{
public:
    Circle(int);
    void output();

private:

    int n;


};


#endif

======== Circle.cpp文件========

#include "Circle.h"


Circle::Circle(int numb)
{
    n=numb;
}



void Circle::output()
{

    cout<<"The number is "<<n<<endl;

}

2 个答案:

答案 0 :(得分:2)

您应该使用#ifndef CIRCLE_H代替#ifdef CIRCLE_H。这意味着“如果没有定义”。

答案 1 :(得分:0)

问题是,您使用了错误的预处理器构造:

#ifdef CIRCLE_H //#ifdef is not the right one!
#define CIRCLE_H

//...

#endif

您应该使用 #ifndef 。为什么呢?

#ifdef表示if token with name, placed after this instruction is already defined, then...。你认为这会奏效吗?如果您包含此文件,则CIRCLE_H未在任何地方定义,因此#ifdef CIRCLE_H将始终评估为false,#ifdef#endif之间的内容将始终被丢弃。

但是当你这样写:

#ifndef CIRCLE_H
#define CIRCLE_H

//...

#endif

你说:if CIRCLE_H has not yet been defined(第一次包含文件时为真)then define CIRCLE_H and proceed。然后定义CIRCLE_H,并且每个下一个包含都不会通过此#ifndef,因为CIRCLE_H已经存在。