.c和.h文件

可以多次声明,但是不能多次定义

对于一个项目,我们应该要很好的处理众多的.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文件

时间: 2024-12-05 11:29:16

.c和.h文件的相关文章

编译过程中,termcap.h 文件找不到路径 licli.a终于生成

编译过程中,termcap.h      文件找不到路径 查看是linux  源码下找不到termcap.h文件 安装了所有关于*cap*的源码包也不起作用 今天终于解决了这个问题,搜termcap.h  发现一篇文章,如下 ----------------------------------------------------------------------------------------- 安装minicom2.3出现termcap.h错误解决方法 2010-05-06 17:12:

使用javah生成.h文件, 出现无法访问android.app,Activity的错误的解决

在工程ndk22/bin/classes中 运行javah  com.cn.ndk22.Ndk22.Activity ,出现了.h文件 我在bin/classes目录中 ,就是无法访问, : 错误:无法访问android.app.Activity 找不到android.app.Activity 如下图所示 于是我cmd定位到ndk/src,中运行 javah com.heima.ndk.ndkActivity, 成功了就能成功了 ...我也不知道为什么.,如下图 总结:  使用javah生成.h

有关stdint.h 文件

有关stdint.h 文件 Google C++编程规范的P25页有如下叙述: <stdint.h> 定义了 int16_t . uint32_t . int64_t 等整型,在需要确定大小的整型时可以使用它们代替 short . unsigned long long 等,在 C 整型中,只使用 int .适当情况下,推 荐使用标准类型如 size_t 和 ptrdiff_t . 最常使用的是,对整数来说,通常不会用到太大,如循环计数等,可以使用普通的 int . 你可以认为 int 至少为

ios的属性和成员变量在.h文件和.m文件的不同

今天被一个最近在学ios的同事问了一个问题:属性写在.h文件中和在.m文件中有什么区别?当时错愣了一下,隐约记得似乎有区别的,但是想不起来,根据自己的经验告诉他,说没区别,结果找了资料发现自己错了,好尴尬,把这些基础的给忘了. 属性在.h文件中和在.m中声明是有区别的.区别就是,在.h文件中声明的属性,外部类可以通过"类实例.属性"来调用,但在.m中声明的则不可以,获取和设置的方法,只能是通过setValue:forKey和valueForKey来实现. 成员变量,有三种权限,就是大家

emmintrin.h文件解析

 Welcome to CSU Online Judge! 1112: 机器人的指令 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 274  Solved: 97 [Submit][Status][Web Board] Description 数轴原点有一个机器人.该机器人将执行一系列指令,你的任务是预测所有指令执行完毕之后它的位置. ·LEFT:往左移动一个单位 ·RIGHT: 往右移动一个单位 ·SAME AS i: 和第i 条执行相同的

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

简单的说其实要理解C文件与头文件(即.h)有什么不同之处,首先需要弄明白编译器的工作过程,一般说来编译器会做以下几个过程:       1.预处理阶段 2.词法与语法分析阶段 3.编译阶段,首先编译成纯汇编语句,再将之汇编成跟CPU相关的二进制码,生成各个目标文件 (.obj文件) 4.连接阶段,将各个目标文件中的各段代码进行绝对地址定位,生成跟特定平台相关的可执行文件,当然,最后还可以用objcopy生成纯二进制码,也就是去掉了文件格式信息.(生成.exe文件) 编译器在编译时是以C文件为单位

VC++中对数据类型的限制limits.h文件内容

limits.h文件中规定了是IDE在OS中规定了每个数据类型的最大值和最小值以及在程序源代码中编译时候所占用的字节数,这这样做有利于帮助程序员在编写程序的时候有效控制在选择合适数据类型的显示范围值. /*** *limits.h - implementation dependent values * * Copyright (c) Microsoft Corporation. All rights reserved. * *Purpose: * Contains defines for a n

S5PV210之添加缺少的-内核提供的&#39;.h&#39;文件 linux3.0.8驱动

怎样解决编译时出现内核提供的函数或变量没有定义,使用source insight搜索功能找到声明的头文件,然后包含该头件就行了: 比如: error: implicit declaration of function 'copy_from_user' 解决:使用source insight搜索功能,可以找到copy_from_user函数是在linux/uaccess.h 头文件中定义,所以包含此头文件就行了. S5PV210之添加缺少的-内核提供的'.h'文件 linux3.0.8驱动,布布扣

银河麒麟操作系统编译缺少kdeamon.h文件

安装银河麒麟操作系统过程中 编译ltp时,如果报缺少kdeamon.h文件 那么就要降级libc6-dev版本至2.21或者升级ltp版本解决,或者将ltp的makefile文件的kdeamon.h的行注释再编译 如果遇到了上述情况就尝试一下这个解决方法吧!! 更多内容欢迎猛戳:www.kylinos.cn

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

//a.h void foo(); //a.c #include "a.h" //我的问题出来了:这句话是要,还是不要? void foo() { return; } //main.c #include "a.h" int main(int argc, char *argv[]) { foo(); return 0; } 今天看到这个问题,很有意思,记录下来复习有些遗忘的知识点. 先说答案,这句话是必须要的! 如果 a.c 中不写,那么编译器是不是会自动把 .h 文