"如有不正确之处,请指出,谢谢"       --Mood


对于一个项目,我们应该要很好的处理众多的.c和.h文件.

1.通过头文件调用库功能:#include <stdio.h>  
   
在很多场合,源代码不便(或不准)向用户公布,只要向用户提供头文件和二进制的库即可。

2.人为定义的.h文件:#include "avformat.h"

一般提供了结构体的声明或者定义,函数的声明.枚举的声明或者定义.宏变量的定义等.

而其定义是在.c文件中实现.

自定义的两种情况:
 


假定编译程序编译
D.c(其中含main())时,发现它include了
A.h(其中声明了某一函数),那么此时编译器将按照事先设定的路径(
Include路径列表及代码文件所在的路径)查找该函数定义.
1.在当前目录找到了与之同名的
A.c文件,在其中找到该函数定义,继续编译.
2.在当前目录找到了与之同名的
A.c文件,在其中没有找到函数定义,然后查找
A.c文件include的其它.h文件相对应的.c文件.若找到函数定义,继续编译.
3.在当前目录未找到与之同名的
A.c文件,则查找A.h中include的其它.h文件向对应的.c文件,若找到函数定义,继续编译.
4如果都没有找到此函数定义,则返回一个编译错误.

include的过程完全可以“看成”是一个文件拼接的过程


若想了解其查找过程,应该去了解编译器的工作原理.


在一个项目中,会有.h文件被多次引用,这样.h文件就会被放到多个.c文件中被多次编译,我们要尽量避免这样的多次声明.从而提高效率.
1
2
3
4
5
6
7
8
9
10
11
12
A.h
int a(); B.h
#include "A.h" C.h
#include "A.h" D.h
#include "A.h"
#include "B.h"

上面的D.h文件中就会重复出现两个int a();的声明阿,这样就有点重复了,这时条件编译宏就派上了用场

1
2
3
4
5
A.h
#ifndef A_H
#define A_H
int a();
#endif

这样就不会重复定义了。

项目.c文件和.h文件关系的更多相关文章

  1. 51单片机C语言学习笔记7:关于.c文件和.h文件

    1)h文件作用 1 方便开发:包含一些文件需要的共同的常量,结构,类型定义,函数,变量申明: 2 提供接口:对一个软件包来说可以提供一个给外界的接口(例如: stdio.h). 2)h文件里应该有什么 ...

  2. 批量删除c文件和h文件中的注释

    不知道大家有没有批量删除c文件和h文件中注释的需要,说起来搞笑,偶然翻出来早先写的一份,首先楼猪不是闲的蛋疼写这东西,工作需要,哪里要砖就要搬.冷门的东西大家需要的时候也不一定好找,分享给大家,省的自 ...

  3. .c文件和.h文件的关系

    参考:12 另一篇:c源文件中为什么要包含自己对应的头文件 问题 在进行C语言文件移植时,遇到 "通常是每个.c文件对应一个.h文件",之前了解过.h文件是头文件,用来引用其他文件 ...

  4. C中的C文件与h文件辨析(转)

    简单的说其实要理解C文件与头文件(即.h)有什么不同之处,首先需要弄明白编译器的工作过程,一般说来编译器会做以下几个过程:       1.预处理阶段 2.词法与语法分析阶段 3.编译阶段,首先编译成 ...

  5. C中的C文件与h文件辨析

    简单的说其实要理解C文件与头文件(即.h)有什么不同之处,首先需要弄明白编译器的工作过程,一般说来编译器会做以下几个过程:       1.预处理阶段 2.词法与语法分析阶段 .编译阶段,首先编译成纯 ...

  6. 语言中.C文件和.H文件的概念和联系

    //a.h void foo(); //a.c #include "a.h" //我的问题出来了:这句话是要,还是不要? void foo() { return; } //main ...

  7. C_文件包含.h文件和包含.c文件总结

    很多人对C语言中的 “文件包含”都不陌生了,文件包含处理在程序开发中会给我们的模块化程序设计带来很大的好处,通过文件包含的方法把程序中的各个功能模块联系起来是模块化程序设计中的一种非常有利的手段. 文 ...

  8. C语言中 *.c和*.h文件的区别!

    C语言中 *.c和*.h文件的区别!  http://blog.163.com/jiaoruijun07@126/blog/static/68943278201042064246409/        ...

  9. C 语言 .h文件的作用

    C语言头文件的作用 最近在工作当中遇到了一点小问题,关于C语言头文件的应用问题,主要还是关于全局变量的定义和声明问题.学习C语言已经有好几年了,工作使用也近半年了,但是对于这部分的东西的确还没有深入的 ...

随机推荐

  1. sun.proxy.$Proxy0 cannot be cast to dao.impl.MyAdviceImpl

    ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml");       ...

  2. dzz使用总结(添加云盘,好用的Web文件管理器,网络播放器)

    dzz添加云盘: http://www.lebook.me/book/22822#fid_3990471 呆萌http://pan.diemoe.net/s/GcdFI4 网络播放器 mediaele ...

  3. synapse socket总结三:心跳(Heartbeat)

    首先转载一篇关于心跳的博文解释: 所谓的心跳包就是客户端定时发送简单的信息给服务器端告诉它我还在而已.代码就是每隔几分钟发送一个固定信息给服务端,服务端收到后回复一个固定信息如果服务端几分钟内没有收到 ...

  4. CSS中border-style的属性

    属性可能的值 值 描述 none 定义无边框. hidden 与 "none" 相同.不过应用于表时除外,对于表,hidden 用于解决边框冲突. dotted 定义点状边框.在大 ...

  5. UVA 10652 Board Wrapping(凸包)

    The small sawmill in Mission, British Columbia, hasdeveloped a brand new way of packaging boards for ...

  6. jsp小商城

    一个小商城,当然,没淘宝那么厉害,只是那时学完j2ee后,发现java原来也可以做网站,学了数据库,servlet,jsp,当时是很惊喜的,可以直接做个这样的东西.而放到今天,学了更多之后,发现可以用 ...

  7. 使用阿里云集成包快速搭建LAMP+FTP教程

    LAMP集成包安装步骤 1.下载开发集成包 下载最新版的阿里云市场提供的WEB开发集成包(内含Apache.Mysql.PHP.vsftpd) #Linux指令wget http://gongdan. ...

  8. Web Application的目录结构

    Java web工程下的webapp或WebContent就是工程的发布文件夹,发布时会把该文件夹发布到tomcat的webapps里. 一个web应用必须要有的目录文件如下: webapp/WebC ...

  9. 基于visual Studio2013解决C语言竞赛题之0518回文数

     题目

  10. three.js 源代码凝视(十四)Math/Sphere.js

    商域无疆 (http://blog.csdn.net/omni360/) 本文遵循"署名-非商业用途-保持一致"创作公用协议 转载请保留此句:商域无疆 -  本博客专注于 敏捷开发 ...