可一再声明,但不是很多定义

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

1.通过头文件调用库功能:#include <stdio.h>  
   
在非常多场合,源码不便(或不准)向用户发布,仅仅要向用户提供头文件和二进制的库就可以

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

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

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

自己定义的两种情况:

1.

  

2.

  

假定编译程序编译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文件里被多次编译,我们要尽量避免这种多次声明.从而提高效率.


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



这样就不会反复定义了.

版权声明:本文博主原创文章,博客,未经同意不得转载。

.c和.h档的更多相关文章

  1. Linux下一个C(编程入门.h档,.c档,而路多文件的调用)

    watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdG90b3R1enVvcXVhbg==/font/5a6L5L2T/fontsize/400/fill/I0 ...

  2. [iOS] 建立与使用Framework

    [iOS] 建立与使用Framework 前言 使用XCode开发iOS项目时,开发人员可以将可重用的程序代码,封装为Library或是Framework来提供其他开发人员使用.这两种封装方式在使用的 ...

  3. GNU MAKE指南

    GNU make 指南 翻译: 哈少 译者按: 本文是一篇介绍 GNU Make 的文章,读完后读者应该基本掌握了 make 的用法.而 make 是所有想在 Unix (当然也包括 Linux )系 ...

  4. Visual Studio跨平台开发实战(2) - Xamarin.iOS基本控制项介绍

    原文 Visual Studio跨平台开发实战(2) - Xamarin.iOS基本控制项介绍 前言 在上一篇文章中, 我们介绍了Xamarin 以及简单的HelloWorld范例, 这次我们针对iO ...

  5. Object-C 新手教程

    大纲 開始吧 下载这篇教学 设定环境 前言 编译 hello world 创建 Classes @interface @implementation 把它们凑在一起 具体说明... 多重參数 建构子( ...

  6. MFC 消息映射、分派和传递

    几个重要的结构体: struct AFX_MSGMAP { AFX_MSGMAP* pBaseMessageMap; AFX_MSGMAP_ENTRY* lpEntries; } struct AFX ...

  7. GNU make 指南

    http://docs.huihoo.com/gnu/linux/gmake.html GNU make 指南 翻译: 哈少 译者按: 本文是一篇介绍 GNU Make 的文章,读完后读者应该基本掌握 ...

  8. Objective-C代码学习大纲(1)

    2011-05-11 14:06 佚名 otierney 字号:T | T 本文为台湾出版的<Objective-C学习大纲>的翻译文档,系统介绍了Objective-C代码,很多名词为台 ...

  9. 简介Objective-C语言

    2011-05-11 11:20 佚名 百度百科 字号:T | T Objective-C,是扩充C的面向对象编程语言.主要使用于Mac OS X和GNUstep这两个使用OpenStep标准的系统, ...

随机推荐

  1. java thread reuse(good)

    I have always read that creating threads is expensive. I also know that you cannot rerun a thread. I ...

  2. Android开发5:布局管理器2(表格布局TableLayout)

    版本:Android4.3 API18  学习整理:liuxinming 概念      TableLayout继承了LinearLayout,因此它的本质依然是线性布局管理器.      表格布局采 ...

  3. Houdini Pyro流体的插值变速

    用简单的节点尝试了下Houdini流体的变速,这里的流体指的是Pyro,而不是FLIP.FLIP仅仅须要记录ID属性然后TimeBlend & TimeShift就可以. Vimeo 上图是一 ...

  4. WPF 设置WebBrowser控件不弹脚本错误提示框

    using System.Reflection; using System.Windows; using System.Windows.Controls; using System.Windows.N ...

  5. 我经历的IT公司面试及离职感受(转)

    毕业后几年一直待在广州,觉得这是一个比较生活化及务实的城市,其互联网公司和相应的投融资环境都不如北深上活跃,大大小小的面试也有几十个,有点规模的公司应该都面试过了,面试一般会见到主力技术人员,技术主管 ...

  6. EF中的事务处理的初步理解

    http://yanwushu.byethost7.com/?p=87 1. EF对事务进行了封装:context的saveChange()是有事务性的. 2. 依赖多个不同的Context的操作(即 ...

  7. NavigationBar 隐藏底部边线,阴影

    NavigationBar 底部默认有一条边线  假设项目中须要隐藏何以採用这个库 https://github.com/samwize/UINavigationBar-Addition/

  8. 查看mysql数据库表大小和最后修改时间

    查看mysql数据库表相关信息如表大小.修改更新等信息,可以通过以下方式: 一   show table status like ’table_name‘ ; 二 在infortmation_sche ...

  9. [开源]C#二维码生成解析工具,可添加自定义Logo (转)

    二维码又称 QR Code,QR 全称 Quick Response,是一个近几年来移动设备上超流行的一种编码方式,它比传统的 Bar Code 条形码能存更多的信息,也能表示更多的数据类型:比如:字 ...

  10. 【ASP.NET】验证控件

    在软件开发中,验证输入信息是否正确,这是不可缺少的一项工作.就拿我们做过的机房收费系统来说,在登录的时候,我们须要对username和用户password进行验证.推断是否为空,推断输入字符是否合理等 ...