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

对于一个项目,我们应该要非常好的处理众多的.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. 计算机视觉与模式识别代码合集第二版two

    Topic Name Reference code Image Segmentation Segmentation by Minimum Code Length AY Yang, J. Wright, ...

  2. Java并发编程--Fork/Join框架使用

    上篇博客我们介绍了通过CyclicBarrier使线程同步,可是上述方法存在一个问题,那就是假设一个大任务跑了2个线程去完毕.假设线程2耗时比线程1多2倍.线程1完毕后必须等待线程2完毕.等待的过程线 ...

  3. SecureCRT 连接虚拟机Linux

    SecureCRT 连接虚拟机Linux   最近在学习linux,在学习中遇到了一些问题,现总结一下. 虚拟机我用的是VirtualBox,完美支持中文,可以在电脑中创建虚拟机环境,上手非常简单.具 ...

  4. 10 个迅速提升你 Git 水平的提示(转)

    最近我们推出了两个教程:熟悉Git的基本功能和 让你在开发团队中熟练的使用Git . 我们所讨论的命令足够一个开发者在Git使用方面游刃有余.在这篇文章中,我们试图探索怎样有效的管理你的时间和充分的使 ...

  5. python中print,return和yield的区别

    def func1(): for i in range(1, 5): print i def func2(): for i in range(1, 5): return i def func3(): ...

  6. (转)Python获取当时时间

    我有的时候写程序要用到当前时间,我就想用python去取当前的时间,虽然不是很难,但是老是忘记,用一次丢一次, 为了能够更好的记住,我今天特意写下python 当前时间这篇文章,如果你觉的对你有用的话 ...

  7. cocos2dx 3.1从零学习(六)——CocosStudio(VS2013project导入及环境设置)

    导入libCocosStudio.libExtensions.libGUI 新建的project例如以下图: 加入现有项目 右键解决方式.例如以下操作: watermark/2/text/aHR0cD ...

  8. 李林APUE之进程的封装

    1.子进程是父进程的副本,获得父进程的数据空间/堆/栈,父子进程共享代码段.子进程从fork后開始运行.返回值=0表示子进程,由于子进程能够通过函数来获取父进程的ID,可是父进程无法知道子进程的ID. ...

  9. ECshop 表结构

    -- 表的结构 `ecs_account_log`CREATE TABLE IF NOT EXISTS `ecs_account_log` (`log_id` mediumint(8) unsigne ...

  10. pygame系列_小球完全弹性碰撞游戏

    之前做了一个基于python的tkinter的小球完全碰撞游戏: 今天利用业余时间,写了一个功能要强大一些的小球完全碰撞游戏: 游戏名称: 小球完全弹性碰撞游戏规则: 1.游戏初始化的时候,有5个不同 ...