多个文件编程(2016.04)_第1页
多个文件编程(2016.04)_第2页
多个文件编程(2016.04)_第3页
多个文件编程(2016.04)_第4页
多个文件编程(2016.04)_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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个文

2、件 把max()函数放到另一个.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文件分成多个文件文件分成多个文件 编译通过编译通过

6、 编译通过编译通过u 每次只能编译一个文件每次只能编译一个文件 u 但,连接时是项目中的所有文但,连接时是项目中的所有文 件一起进行连接,因此出现了件一起进行连接,因此出现了 重复定义重复定义 切记:头文件中切记:头文件中只声明,不定义只声明,不定义 预处理后可 以理解为 预处理后可 以理解为 情景二:函数如何访问其他文件中的外部变量?(续) 将一个将一个.c .c文件分成多个文件文件分成多个文件 声明:不分配内存,可以声明多次,可以放在头文件中,也 可以放在.c文件中 定义:分配内存,只能定义一次,一定要放在.c文件中 / a.c #include int f(int i); extern

7、int k; void main() int i=5; f(k); int f(int i) return i+1; / 声明一个函数声明一个函数 / 声明一个外部变量,说明这个变声明一个外部变量,说明这个变 量定义在其它文件中量定义在其它文件中 / 定义一个变量定义一个变量 / 调用一个函数调用一个函数 / 定义一个函数定义一个函数 如果又有一个如果又有一个b.c文件,也要文件,也要 调用调用f()函数,怎么办?函数,怎么办? / a.c #include int f(int i); extern int k; void main() int i=5; f(k); int f(int i)

8、return i+1; / b.c int f(int i);/声明声明 int k=10; /定义定义 int bf(int i) 问题:如何还有c.c, d.c,文件也要用 f()函数呢? 答:同样在各源文件中声明f()函数。 但由此带来的问题: 1.程序中到处都有f()函数的声明,如 果f()的原型需要修改时,就需要一 一修改所有的原型 2.程序效率低下 最好的办法是:将函数的声明放到头 文件中,如,f.h / 一个源文件一个源文件 #include void f1(); void f2(); int main() f1(); f2(); void f1() printf(f1()n);

9、 void f2() printf(f2()n); / main.c #include f.h int main() f1(); f2(); / f.c / 函数定义放在函数定义放在.c文件中文件中 #include #include f.h void f1() printf(f1()n); void f2() printf(f2()n); / f.h /函数声明都放在头文件中函数声明都放在头文件中 void f1(); void f2(); 同一个编译单元里,同名的结构不能被重复声明 如果头文件中有结构的声明,很难保证这个头文件 不会在一个编译单元里被#include多次 将一个将一个.c

10、.c文件分成多个文件文件分成多个文件 情景三:两个文件如何共享同一个宏定义或类型定义? 只用一个只用一个.c文件实现文件实现 每个每个.c文件都编译通文件都编译通 过,但连接时错误过,但连接时错误 用多个用多个.c文件实现文件实现 这样就导致结构体类型这样就导致结构体类型 Date声明在声明在main()中出中出 现了现了2次,是重复声明次,是重复声明 #ifndef 宏名宏名 #define 宏名宏名 结构体声明结构体声明 #endif 运用条件编译和宏,保证这个运用条件编译和宏,保证这个 头文件在一个编译单元中只会头文件在一个编译单元中只会 被被#include一次一次 为避免重复声明,

11、需要用“标准头文 件结构” 编译预处理时可以理解为这种代码 一个多文件项目中,通常会包含若干的.c文件和.h文件 基本原则:把不分配内存的声明语句放到头文件中,包括: o 用于避免重复包含的#ifndef #endif语句 o 宏定义 o struct、union、enum等类型的typedef类型定义 o 全局变量及函数的不申请内存的声明(变量前面带extern,函数不 给出具体定义) 最好把所有的声明放到一个统一的global.h文件中 o 哪个.c文件要用到对应的函数、结构体、全局变量时就可以包含这个头文件 o 不要把这些声明重复地放到不同的.c文件中,否则一旦发生改动,将非常麻 烦 .

12、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的过程,会改变函数的名字 .h Sum(int, int) .cpp Sum(int, int) .c Sum(int, int) .obj Sumz .obj Sum #include#

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论