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=;i<=;i++)
enQueue(&myQueue,i); viewQueue(&myQueue); QElemtype a;
for(int i=;i<;i++)
{
delQueue(&myQueue,&a);
printf("%d\n",a);
}
destoryQueue(&myQueue);
return ;
}

  

    

  

C/C++:提升_头文件的使用的更多相关文章

  1. c语言_头文件_windows.h

    概述 Win32程序的开头都可看到: #include <windows.h> WINDOWS.H是一个最重要的头文件,它包含了其他Windows头文件,这些头文件的某些也包含了其他头文件 ...

  2. c语言_头文件_stdlib

    简介 stdlib 头文件即standard library标准库头文件 stdlib 头文件里包含了C.C++语言的最常用的系统函数 该文件包含了C语言标准库函数的定义 stdlib.h里面定义了五 ...

  3. c语言_头文件

    传统 C++ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 #include <assert.h> //设定插入点 #include <ctyp ...

  4. 零基础逆向工程16_C语言10_宏定义_头文件_内存分配_文件读写

    #define 无参数的宏定义的一般形式为:#define 标识符 字符序列 如:#define TRUE 1 注意事项: 1.之作字符序列的替换工作,不作任何语法的检查 2.如果宏定义不当,错误要到 ...

  5. Qt使用预编译头文件Using Precompiled Headers(提升10倍以上)

    预编译头文件是被很多编译器用来编译稳定的代码以及将编译好的稳定代码存储在二进制文件中用于提升编译性能.在随后的编译中,编译器将加载存储状态继续编译指定的文件.每一个随后的编译将更快,因为稳定的代码不需 ...

  6. Ubuntu找不到stdio.h等头文件_安装c库_build-essential安装失败解决

    最近安装的Ubuntu1804系统,vim.gcc都是现安的,用gcc编译时出现找不到头文件情况: 于是百度. 原来linux类的操作系统上面开发程序,光有了gcc 是不行的,它还需要一个 build ...

  7. C预编译, 预处理, C/C++头文件, 编译控制,

    在所有的预处理指令中,#Pragma 指令可能是最复杂的了,它的作用是设定编译器的状态或者是指示编译器完成一些特定的动作.#pragma指令对每个编译器给出了一个方法,在保持与C和C++语言完全兼容的 ...

  8. Makefile中头文件在依赖关系中作用

    摘于:http://bbs.csdn.net/topics/120024677 (1)在makefile的依赖关系中用不用体现.h头文件?(2)如果在依赖关系中要体现.h头文件,应该体现到什么层次?= ...

  9. C头文件和源文件的连

    (http://blog.163.com/yui_program/blog/static/18415541520115177852896/) 一.源文件如何根据#include来关联头文件 1,系统自 ...

随机推荐

  1. RHEL6.5中完成播放音乐的“大业”

    参考文章:http://ylw6006.blog.51cto.com/470441/589964 感谢:ylw6006@51CTO 首先,费了不少劲去找到三个文件(还要对应版本el6.i686或el6 ...

  2. mysql 数值函数

    可使用常见的算术操作符.注意就 -. +和 *而言, 若两个参数均为正数,则其计算结果的精确度为 BIGINT (64比特),若其中一个参数为无符号整数, 而其它参数也是整数, 则结果为无符号整数.请 ...

  3. Webstorm 2016内置web服务器配置

    运行three.js的官方的例子.本来想用IIS来运行,运行不了.所以用webstorm,用鼠标右键的方式,来运行,如下图 但是有一天,我把IIS配置好了,可以在IIS中运行了(只是把build文件夹 ...

  4. 对非线程安全类List<T>的一些总结

    一个项目的一个功能点,需要从接口接受返回数据,并对返回的数据进行一些业务处理,处理完成之后,添加到一个List<T>中,然后在View中循环这个List<T>,展示所有的数据. ...

  5. 从一个简单例子来理解js引用类型指针的工作方式

    <script> var a = {n:1}; var b = a; a.x = a = {n:2}; console.log(a.x);// --> undefined conso ...

  6. 将Win8.1/WP8.1应用迁移到Universal Windows Platform

    在上一篇在VS2015 RC打开CTP中创建的工程,我们介绍了怎么在RC中打开CTP中创建的Universal 工程,这一篇我们来讲下怎么将Windows 8.1/WP8.1的应用迁移到Univers ...

  7. 第二次作业:Github的使用

    Github的使用 一·注册:     要想使用github第一步当然是注册github账号了.之后就可以创建仓库了(免费用户只能建公共仓库),Create a New Repository,填好名称 ...

  8. ng-template寄宿方式

    如果你是一个angular的开发者的话,对于ng-html2js你应该 很熟悉.对于angular的指令,我们经常需要定义模板( directive template/templateUrl),你可以 ...

  9. 解决Win7 软件图标不显示--Win7图标异常,快捷方式不显示解决方法

    电脑症状:WIN7的系统,桌面上的图标显示的不正常,快捷方式显示的是未知程序.看不到程序默认图标,快捷方式图标不显示. 解决方法:删除程序图标缓存即可.   将下面的内容复制到记事本保存为“Repai ...

  10. iOS app 程序启动原理

    iOS app 程序启动原理 Info.plist: 常见设置     建立一个工程后,会在Supporting files文件夹下看到一个"工程名-Info.plist"的文件, ...