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=;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++:提升_头文件的使用的更多相关文章
- c语言_头文件_windows.h
概述 Win32程序的开头都可看到: #include <windows.h> WINDOWS.H是一个最重要的头文件,它包含了其他Windows头文件,这些头文件的某些也包含了其他头文件 ...
- c语言_头文件_stdlib
简介 stdlib 头文件即standard library标准库头文件 stdlib 头文件里包含了C.C++语言的最常用的系统函数 该文件包含了C语言标准库函数的定义 stdlib.h里面定义了五 ...
- c语言_头文件
传统 C++ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 #include <assert.h> //设定插入点 #include <ctyp ...
- 零基础逆向工程16_C语言10_宏定义_头文件_内存分配_文件读写
#define 无参数的宏定义的一般形式为:#define 标识符 字符序列 如:#define TRUE 1 注意事项: 1.之作字符序列的替换工作,不作任何语法的检查 2.如果宏定义不当,错误要到 ...
- Qt使用预编译头文件Using Precompiled Headers(提升10倍以上)
预编译头文件是被很多编译器用来编译稳定的代码以及将编译好的稳定代码存储在二进制文件中用于提升编译性能.在随后的编译中,编译器将加载存储状态继续编译指定的文件.每一个随后的编译将更快,因为稳定的代码不需 ...
- Ubuntu找不到stdio.h等头文件_安装c库_build-essential安装失败解决
最近安装的Ubuntu1804系统,vim.gcc都是现安的,用gcc编译时出现找不到头文件情况: 于是百度. 原来linux类的操作系统上面开发程序,光有了gcc 是不行的,它还需要一个 build ...
- C预编译, 预处理, C/C++头文件, 编译控制,
在所有的预处理指令中,#Pragma 指令可能是最复杂的了,它的作用是设定编译器的状态或者是指示编译器完成一些特定的动作.#pragma指令对每个编译器给出了一个方法,在保持与C和C++语言完全兼容的 ...
- Makefile中头文件在依赖关系中作用
摘于:http://bbs.csdn.net/topics/120024677 (1)在makefile的依赖关系中用不用体现.h头文件?(2)如果在依赖关系中要体现.h头文件,应该体现到什么层次?= ...
- C头文件和源文件的连
(http://blog.163.com/yui_program/blog/static/18415541520115177852896/) 一.源文件如何根据#include来关联头文件 1,系统自 ...
随机推荐
- CCNA第四章第五章Cisco的IOS与SDM及其管理考试要点学习笔记
1. IOS的用户界面 Cisco互联网操作系统(IOS)是思科路由器和大多数交换机的核心,它是一个可以提供路由,交换,网络互联以及远程通信功能的专有内核. Cisco路由器的IOS软件 ...
- 利用nodejs实现登录并转码视频(原创)
nodejs的出现让前端人员可以使用js打造后台,也许哪天就真的摆脱了对java或者php的依赖了. 今天跟大家分享一个利用nodejs接受前端post请求,并实现视频转码的这样一个例子.视频转码用到 ...
- JavaScript 基础第六天
一.引言 前面我们介绍了有关于内置对象的很多很多的API,讲道理得话如果想彻底的掌握那一定要经过一定的代码段沉淀下.大家可以想象一下,既然在程序中有很多的内置对象供我们使用,那我们是不是也可以定义一些 ...
- xml note
10. 两种不同的XML分析模型: DOM:所有数据位于内存 SAX:流程性分析,不必把所有数据Load到内存中,可分析大型的XML文件,常用于Servlet-side的XML-xhtml ...
- Linux之RPM安装软件
源码包 (可以看到源代码) 脚本安装包(写好的xsheel一键安装.本质还是源码包和二进制包) 二进制包(RPM包.系统默认包) 包管理系统简单,通过命令就可以安装.卸载 ...
- 一次与51aspx客服MM谈话 -- 坑是怎么发展的
GG从发布以来,我每次版本更新都会同步到51aspx源码网站,这次在同步更新GG V3.2版本到51aspx时,出了点小状况: 上传3.2版本几个小时后,我再次上去查看,发现其状态变成了“退回”,于是 ...
- 分享一个异步任务在遇到IO异常时支持递归回调的辅助方法
public void TryAsyncActionRecursively<TAsyncResult>( string asyncActionName, Func<Task<T ...
- Java IO5:字符流
字符流 字节流提供了处理任何类型输入/输出操作的功能(因为对于计算机而言,一切都是0和1,只需把数据以字节形式表示就够了),但它们不可以直接操作Unicode字符,因为上一篇文章写了,一个Unicod ...
- js实现快速排序
非原创: var quickSort = function(arr){ if(arr.length<=1){return arr;} var pivotIndex = Math.floor(ar ...
- SQL Server内存理解的误区
SQL Server内存理解 内存的读写速度要远远大于磁盘,对于数据库而言,会充分利用内存的这种优势,将数据尽可能多地从磁盘缓存到内存中,从而使数据库可以直接从内存中读写数据,减少对机械磁盘的IO请求 ...