版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、 main()里的代码太长了可以分成几个函数 一个源代码文件太长了可以分成几个文件 两个独立的源代码(即,2个文件都有独立的main函数)文件不能编译组成可执行的文件 编译器一次只能处理一个.C文件 可以新建一个项目,把几个源代码文件都加入进去 IDE中分别有编译和组建命令o编译:针对单个源代码文件o组建:针对整个项目#include int max(int a, int b);int main() int a=10; int b=20; printf(%dn,max(a,b); return 0;int max(int a, int b) return ab?a:b; 拆成2个文件把max(
2、)函数放到另一个.c文件中如果在主函数中没有对如果在主函数中没有对max()函数进行函数原型的说明,则编译后出现警告函数进行函数原型的说明,则编译后出现警告但程序仍然可以运行,且运行结果也是对的但程序仍然可以运行,且运行结果也是对的原因:由于在主函数中没有函数原型,所以编译器猜测认为原因:由于在主函数中没有函数原型,所以编译器猜测认为-函数类型、函数类型、参数类型都是参数类型都是int,而程序中的情况正好与之一致,故程序可以运行,且结果,而程序中的情况正好与之一致,故程序可以运行,且结果是正确的。是正确的。原因:编译器猜测的类型与实际类型不符,导致传递的数值不对原因:编译器猜测的类型与实际类型
3、不符,导致传递的数值不对故,在主函数中应该加上故,在主函数中应该加上max()原型声明原型声明如果函数的类型不是如果函数的类型不是int呢?呢?运行结果:运行结果:X格式符换成%lf也不对将一个将一个.c .c文件分成多个文件文件分成多个文件X解决办法:增加一个头文件,存放函数的原型解决办法:增加一个头文件,存放函数的原型编译时,编译器会将编译时,编译器会将#include 中包含的文本内容原封不动地插入到它所中包含的文本内容原封不动地插入到它所在的地方在的地方 情景一:某文件中的函数如何调用定义在其他文件中的函数? 情景二:函数如何访问其他文件中的外部变量? 情景三:两个文件如何共享同一个宏
4、定义或类型定义?方法:把要在源文件之间共享的信息放在头文件,在需要调用这个函数的源代码文件中用#include包含这个头文件格式一:格式一:#include 格式二:格式二:#include “文件名文件名”搜索系统头文件所在目录include如,#include 先搜索当前目录,然后再搜索系统头文件所在目录include#include “myheader.h”也可以:也可以:#include “d:c_programmyheader.h”情景一:某文件中的函数如何调用定义在其他文件中的函数?编译错误:编译错误:如果有一个全局变量呢?如果有一个全局变量呢?解决办法:解决办法:在头文件中增加全
5、局变在头文件中增加全局变量的声明量的声明extern 类型类型 变量名变量名;表示该变量是在其它文件中表示该变量是在其它文件中已定义的全局变量已定义的全局变量情景二:函数如何访问其他文件中的外部变量?将一个将一个.c .c文件分成多个文件文件分成多个文件能不能直接在头文件能不能直接在头文件中定义全局变量?中定义全局变量?编译通过编译通过连接时错误,为什么?连接时错误,为什么?情景二:函数如何访问其他文件中的外部变量?(续)将一个将一个.c .c文件分成多个文件文件分成多个文件编译通过编译通过编译通过编译通过u 每次只能编译一个文件每次只能编译一个文件u 但,连接时是项目中的所有文但,连接时是项
6、目中的所有文件一起进行连接,因此出现了件一起进行连接,因此出现了重复定义重复定义切记:头文件中切记:头文件中只声明,不定义只声明,不定义预处理后可以理解为预处理后可以理解为情景二:函数如何访问其他文件中的外部变量?(续)将一个将一个.c .c文件分成多个文件文件分成多个文件 声明:不分配内存,可以声明多次,可以放在头文件中,也可以放在.c文件中 定义:分配内存,只能定义一次,一定要放在.c文件中/ a.c#include int f(int i);extern int k;void main() int i=5; f(k);int f(int i) return i+1;/ 声明一个函数声明一
7、个函数/ 声明一个外部变量,说明这个变声明一个外部变量,说明这个变量定义在其它文件中量定义在其它文件中/ 定义一个变量定义一个变量/ 调用一个函数调用一个函数/ 定义一个函数定义一个函数如果又有一个如果又有一个b.c文件,也要文件,也要调用调用f()函数,怎么办?函数,怎么办?/ a.c#include int f(int i);extern int k;void main() int i=5; f(k);int f(int i) return i+1;/ b.cint f(int i);/声明声明int k=10; /定义定义int bf(int i) 问题:如何还有c.c, d.c,文件也
8、要用f()函数呢?答:同样在各源文件中声明f()函数。但由此带来的问题:1.程序中到处都有f()函数的声明,如果f()的原型需要修改时,就需要一一修改所有的原型 2.程序效率低下最好的办法是:将函数的声明放到头文件中,如,f.h/ 一个源文件一个源文件#include void f1();void f2();int main() f1(); f2(); void f1() printf(f1()n); void f2() printf(f2()n); / main.c#include f.hint main() f1(); f2(); / f.c/ 函数定义放在函数定义放在.c文件中文件中#i
9、nclude #include f.h void f1() printf(f1()n); void f2() printf(f2()n); / f.h /函数声明都放在头文件中函数声明都放在头文件中void f1();void f2(); 同一个编译单元里,同名的结构不能被重复声明 如果头文件中有结构的声明,很难保证这个头文件不会在一个编译单元里被#include多次将一个将一个.c .c文件分成多个文件文件分成多个文件情景三:两个文件如何共享同一个宏定义或类型定义?只用一个只用一个.c文件实现文件实现每个每个.c文件都编译通文件都编译通过,但连接时错误过,但连接时错误用多个用多个.c文件实现
10、文件实现这样就导致结构体类型这样就导致结构体类型Date声明在声明在main()中出中出现了现了2次,是重复声明次,是重复声明#ifndef 宏名宏名#define 宏名宏名结构体声明结构体声明#endif运用条件编译和宏,保证这个运用条件编译和宏,保证这个头文件在一个编译单元中只会头文件在一个编译单元中只会被被#include一次一次为避免重复声明,需要用“标准头文件结构”编译预处理时可以理解为这种代码 一个多文件项目中,通常会包含若干的.c文件和.h文件 基本原则:把不分配内存的声明语句放到头文件中,包括:o 用于避免重复包含的#ifndef #endif语句o 宏定义o struct、u
11、nion、enum等类型的typedef类型定义o 全局变量及函数的不申请内存的声明(变量前面带extern,函数不给出具体定义) 最好把所有的声明放到一个统一的global.h文件中o 哪个.c文件要用到对应的函数、结构体、全局变量时就可以包含这个头文件o 不要把这些声明重复地放到不同的.c文件中,否则一旦发生改动,将非常麻烦 .c源文件中包含一系列函数、全局变量、静态变量的分配内存的定义 如果,一个变量int k,只在a.c文件中使用o 定义为 extern int k;o 注意,要定义在所有函数的外面 如果,一个变量int g,希望能被所有.c文件读取 先在任何一个.c文件中定义 int g; 再把这个变量的声明放到 global.h 头文件中 然后在任何想访问变量g的.c文件中包含这个global.h头文件 C语言文件保存在.c文件中,编译时按C标准 C+文件保存在.cpp中,编译时按C+标准 C+标准编译文件时,为支持函数重载,编译器执行一项name mangle的过程,会改变函数的名字 .hSum(int, int) .cppSum(int, int) .cSum(int, int) .objSumz .objSum#in
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 《英国小说家罗琳》课件
- 2016年全国科普日网络微信知识竞赛试题301(附答案)
- 20.电工基础期末试卷参考答案
- 土地(山地)临时占用协议
- 《化学资料小常识》课件
- 焊接裂纹分类与危害
- 专业知识与教研实践
- 建筑行业助理的职责概述
- 老年活动中心前台服务工作总结
- 艺术与心理健康的关联研究计划
- 教育技术研究员合同模板
- 【MOOC期末】《电子技术实习SPOC》(北京科技大学)期末慕课答案
- 新媒体技术基础知识单选题100道及答案解析
- 2025蛇年带横批春联对联200副带横批
- 互联网+创新商业模式考核试卷
- 福建省福州市2023-2024学年高一1月期末生物试题(解析版)
- 四川省南充市2023-2024学年高一上学期期末考试 政治 含解析
- 江苏省扬州市梅岭中学2023-2024学年七年级上学期期末地理试题(含答案)
- 克罗恩病病例分析
- 《冠心病》课件(完整版)
- DB43T 1694-2019 集体建设用地定级与基准地价评估技术规范
评论
0/150
提交评论