• C/C++:提升_头文件的使用


    C/C++:提升_头文件的使用


    ◇写在前面

      学到现在,很多人编写程序时只会使用一个文件。这样在代码量较小的时候,更利于表达程序,但是随着代码量的逐步增加,程序的思维逻辑不是我们一下子就可以完全理清的,因为我们的程序需要多个人共同参与,特别是编写较大工程项目时,这时我们需要使用自己编写的头文件,来减少重复劳动。由于本人天生驽钝,下面就非常简单的谈一谈头文件的使用

      在C语言家族程序中,头文件被大量使用。一般而言,每个C++/C程序通常由头文件(header files)和定义文件(definition files)组成。头文件作为一种包含功能函数、数据接口声明的载体文件,主要用于保存程序的声明(declaration),而定义文件用于保存程序的实现 (implementation)。 .c就是你写的程序文件。


    ◇头文件的编写规范

      头文件主要写:

            类的声明(包括类里面的成员和方法的声明)

            函数原型

            #define常数等,但一般来说不写出具体的实现。

      在写头文件时需要注意,在开头和结尾处必须按照如下样式加上预编译语句(如下):

    #ifndef CIRCLE_H
    #define CIRCLE_H
    
    //你的代码写在这里
    
    #endif

      |说明

        这样做是为了防止重复编译,不这样做就有可能出错。

        至于CIRCLE_H这个名字实际上是无所谓的,你叫什么都行,只要符合规范都行。原则上来说,非常建议把它写成这种形式,因为比较容易和头文件的名字对应。


    ◇源文件的编写规范

      源文件主要写实现头文件中已经声明的那些函数的具体代码。

      需要注意的是,开头必须#include一下实现的头文件,以及要用到的头文件。那么当你需要用到自己写的头文件中的类时,只需要#include进来就行了。


    ◇实例

      我起初用链表实现了一个队列,但是我把所有的实现和main方法写在一起了,可后来我又在一个程序中用到队列,看到满满的队列代码,我实在不忍心,所以我就尝试用头文件实现一个模板,以后直接调用即可。

      队列的头文件:文件名(myQueue.h)

    #define OK 1
    #define ERROR 0
    
    typedef int QElemtype;
    typedef int status;
    
    typedef struct QNode
    {
        QElemtype data;
        struct QNode *next;
    }QNode,*QueuePtr;
    
    typedef struct{
        QueuePtr head;
        QueuePtr rear;
    }LinkQueue;
    
    status initQueue(LinkQueue* que) ;
    status destoryQueue(LinkQueue* que); //回收队列
    status enQueue(LinkQueue* que,QElemtype e);
    status delQueue(LinkQueue* que,QElemtype *t);
    status viewQueue(LinkQueue* que);

       队列的实现文件:文件名(myQueue.c)

    #include <stdio.h>
    #include <stdlib.h>
    #include "myQueue.h"
    
    status initQueue(LinkQueue* que) //初始化队列
    {
        que->head=que->rear=(QueuePtr)malloc(sizeof(QNode));
        if(!que->head)  //这段代码对队列里面的用户自定义数据类型进行了初始化
            return ERROR;
        return OK;
    }
    status destoryQueue(LinkQueue* que) //回收队列
    {
        while(que->head)
        {
            que->rear = que->head->next;
            free(que->head);
            que->head=que->rear;
        }
        return OK;
    }
    status enQueue(LinkQueue* que,QElemtype e)
    {
        QueuePtr p = (QueuePtr)malloc(sizeof(QNode));
        if(!p)
            return ERROR;
        p->data=e;
        p->next=NULL;
        que->rear->next = p;
        que->rear=p;
        return OK;
    }
    
    status delQueue(LinkQueue* que,QElemtype *t)
    {
        if(que->rear==que->head)
            return ERROR; //队列为空
        QueuePtr p = que->head->next;
        *t=p->data;
    
        que->head->next=p->next;
        if(que->rear==p)
            que->rear=que->head;
        free(p);
        return OK;
    }
    
    status viewQueue(LinkQueue* que)
    {
        if(que->rear == que->head)
            return ERROR;
        
        QueuePtr p =que->head->next;
        while(p)
        {
            printf("val:%d",p->data);
            p=p->next;
        }
        return OK;
    }

      这样我们就不用在关心队列的实现细节,直接我们的程序中添加头文件调用即可。

      队列的调用文件:文件名(my.c)

    #include <stdio.h>
    #include <stdlib.h>
    #include "myQueue.h"
    
    int main(int argc, char **argv)
    {
        LinkQueue myQueue;
        initQueue(&myQueue);
        for(int i=1;i<=6;i++)
            enQueue(&myQueue,i);
        
        viewQueue(&myQueue);
        
        QElemtype a;
        for(int i=0;i<6;i++)
        {
            delQueue(&myQueue,&a);
            printf("%d
    ",a);
        }
        destoryQueue(&myQueue);
        return 0;
    }

      

        

      

  • 相关阅读:
    HTML5进阶段内联标签汇总(小篇)
    Html5元素及基本语法
    HTML5中判断横屏竖屏
    用H5+Boostrap做简单的音乐播放器
    html5学习笔记(3)--主题结构元素-1
    css3制作旋转立方体相册
    css3的媒体查询(Media Queries)
    认识和理解css布局中的BFC
    getattr、setattr、hasattr
    Python-有名匿名函数、列表推导式
  • 原文地址:https://www.cnblogs.com/MrSaver/p/5949358.html
Copyright © 2020-2023  润新知