zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    Jupyter Notebook 编辑器美化
    Python3 与 C# 基础语法对比(List、Tuple、Dict、Set专栏)
    Ubuntu 18.04 安装微信(附企业微信)
    区块链概念
    Python3 与 C# 基础语法对比(String专栏)
    用Python3、NetCore、Shell分别开发一个Ubuntu版的定时提醒(附NetCore跨平台两种发布方式)
    ArchLinux 设置时间同步和硬件时间同步错误 No usable clock interface found
    ArchLinux dwm的安装和配置
    POJ-1182 食物链 并查集(互相关联的并查集写法)
    POJ-2236 Wireless Network 并查集
  • 原文地址:https://www.cnblogs.com/kongbursi-2292702937/p/14746276.html
Copyright © 2011-2022 走看看