11.C进阶之多文件C语言项目

来源:互联网 发布:编程楼主 编辑:程序博客网 时间:2024/05/16 08:09

11.1.为什么需要多文件项目
(1)真正的C语言项目是很复杂的,包含很多个函数,写在一个文件中不利于查找、组织、识别。所以人为的将复杂项目中的很多函数分成了不同的功能模块,然后分开放在不同的.c文件中,于是乎有了多文件项目。
(2)在多文件项目中,你在任何一个文件中定义的任何一个函数,都有可能被其他任何一个文件中的函数来调用。但是大家最终都是被main函数调用的,有可能是直接调用,也可能是间接调用。


11.2.跨文件调用函数
(1)在调用函数前,要先声明该被调用函数的原型。函数使用的三大要素为函数定义、函数声明、函数调用:
如果没有定义,只有声明和调用,则编译时会报连接错误,undefined reference to `func_in_a’。
如果没有声明,只有定义和调用,则编译时一般会报警告,极少数情况下不会报警告,但是最好加上声明。
如果没有调用,只有定义和声明,则编译时一般会报警告,有时不会报警告,这时候程序执行不会出错。
(2)在一个项目下,不管是一个文件内,还是该项目的多个文件内,都不能出现函数名重复的情况。一旦重复,编译器就会报错。主要是因为编译器在调用函数时是根据函数名来识别不同的函数的,它被两个相同的函数名搞混乱了。


11.3.跨文件引用全局变量
(1)在a.c中定义的全局变量,在a.c中可以使用,在b.c中不可以直接使用,编译时报错 error: ‘g_a’ undeclared (first use in this function)
(2)想在b.c中使用a.c中定义的全局变量,有一个间接的使用方式。在a.c中写一个函数,然后函数中使用a.c中定义的该全局变量,然后在b.c中先声明函数,再使用函数。即可达到在b.c中间接引用a.c中变量的目的。
(3)想在b.c中直接引用a.c中定义的全局变量g_a,则必须在b.c中引用前先声明g_a。使用语句extern int g_a;这句话是一个全局变量g_a的声明,这句话告诉编译器,我在外部(隶属于同一项目下的别的文件中)某个地方定义了一个全局变量int g_a,而且我现在要在这里引用它,告诉你编译器一声,不用报错了。


11.4.跨文件使用函数和变量总结
(1)讨论跨文件使用问题,只用讨论全局变量和函数就可以了,因为局部变量和静态局部变量的作用域仅限于函数内部。
(2)不管是函数还是变量,都有定义、声明、引用三要素。定义是创造这个变量或者函数,声明是向编译器交代它的原型,引用是使用这个变量或函数。
(3)在一个程序里面,一个函数/变量只能定义一次,引用可以有无数次,声明可以有无数次。因为函数/变量的定义实际上是创造了这个函数/变量,所以只能有一次。多次创造同名的变量会造成变量名重复,冲突;多次创造同名的函数也会造成函数名重名冲突。


11.5.头文件的引入
(1)在庞大的项目中有很多个源文件,每个源文件中都有很多个函数,并且需要在各个文件中相互穿插引用函数。我们使用头文件解决函数的声明问题。
(2)#include包含头文件时,用<>和”“的区别:<>用来包含系统自带的头文件,系统自带指的是编译器\库函数\操作系统提供的头文件。”“用来包含项目目录中的头文件,这些一般是我们自己写的。
(3)防止重复包含头文件:
这里写图片描述
(4)全局变量重复定义问题:写程序时,最好不要在头文件中定义变量。因为这时该头文件被多个源文件包含时,就会出现重复定义问题。全局变量的定义就应该放在某个源文件中,然后在别的源文件中使用前进行extern声明。


11.global_headera.c/* * 公司:XXXX * 作者:Rston * 博客:http://blog.csdn.net/rston * GitHub:https://github.com/rston * 项目:C进阶之多文件C语言项目 * 功能:跨文件引用全局变量、函数及使用头文件。 */#include <stdio.h>#include "common.h"int main(int argc, char **argv){    g_val = sub(8, 2);    printf("sub(8, 2) = %d.\n", g_val);    return 0;}
11.global_headerb.c/* * 公司:XXXX * 作者:Rston * 博客:http://blog.csdn.net/rston * GitHub:https://github.com/rston * 项目:C进阶之多文件C语言项目 * 功能:跨文件引用全局变量、函数及使用头文件。 */#include <stdio.h>#include "common.h"// 定义全局变量int g_val = 0;              // 实现减法int sub(int a, int b){    return (a - b);}
11.global_headercommon.h#ifndef __COMMON_H__#define __COMMON_H__// 函数声明int sub(int a, int b);// 全局变量声明,注意声明格式extern int g_val;#endif

0 0
原创粉丝点击