C++的#ifndef/#define/#endif的含义

.h文件作用:

写类的声明(包括类里面的成员和方法的声明)、函数原型、#define常数等,但一般来说不写出具体的实现。

.cpp文件作用:

源文件主要写实现头文件中已经声明的那些函数的具体代码。需要注意的是,开头必须#include一下实现的头文件,以及要用到的头文件。那么当你需要用到自己写的头文件中的类时,只需要#include进来就行了。

示例:

Circle.h

 

#ifndef CIRCLE_H
#define CIRCLE_H

class Circle
{
private:
    double r;//半径
public:
    Circle();//构造函数
    Circle(double R);//构造函数
    double Area();//求面积函数
};

#endif

 

Circle.cpp

 

#include "Circle.h"

Circle::Circle()
{
    this->r=5.0;
}

Circle::Circle(double R)
{
    this->r=R;
}

double Circle:: Area()
{
    return 3.14*r*r;
}

 

main.cpp

 

#include <iostream>
#include "Circle.h"
using namespace std;

int main()
{
    Circle c(3);
    cout<<"Area="<<c.Area()<<endl;
    return 1;
}

 

 

 

 

#ifndef/#define/#endif 防止该头文件被重复引用

“被重复引用”是指一个头文件在同一个cpp文件中被include了多次,这种错误常常是由于include嵌套造成的。比如:存在a.h文件#include "c.h"而此时b.cpp文件导入了#include "a.h" 和#include "c.h"此时就会造成c.h重复引用。

被重复引用的后果:

有些头文件重复引用只是增加了编译工作的工作量,不会引起太大的问题,仅仅是编译效率低一些,但是对于大工程而言编译效率低下那将是一件多么痛苦的事情。
有些头文件重复包含,会引起错误,比如在头文件中定义了全局变量(虽然这种方式不被推荐,但确实是C规范允许的)这种会引起重复定义。

 

条件编译 命令 最常见的形式为:  

#ifdef 标识符 
程序段1 
#else 
程序段2 
#endif

它的作用是:当标识符已经被定义过(一般是用#define命令定义),则对程序段1进行编译,否则编译程序段2。 
其中#else部分也可以没有,即: 

#ifdef 
程序段1 
#endif

 

例如:

//如你在头文件aaa.h中定义了一个类aaa如下:   
  class   aaa   
  {   
  };   
/*如果两次#include   "aaa.h"(不见得是直接,也有可能两个不同的头文件中都包含了这个头文件)就会出错,因为相同的类不能定义两次。把aaa.h稍做修改:  */ 
  #ifndef   _aaa_   
  #define   _aaa_   
  class   aaa   
  {   
  };   
  #endif   
/*就可以避免这样的问题。因为当你已经包含过这个文件,_aaa_就会有了定义,那么#ifndef的条件为假,就不会再执行后面的类定义了。 */

 

参考链接:https://blog.csdn.net/fly_yr/article/details/39964035

 参考链接:https://www.cnblogs.com/fenghuan/p/4794514.html

posted @ 2021-05-08 19:32  kongbursi  阅读(472)  评论(0编辑  收藏  举报