2019-08-22多文件C语言项目

1.简单的C语言程序(项目)只有一个C文件,编译的时候gcc a.c -o a,执行的时候./a
2.复杂的C语言程序(项目)由是由多个C文件构成的,比如一个项目中包含2个C文件(a.c, b.c ),编译的时候用gcc a.c b.c -o ab,执行的时候./ab
在a.c和b.c中分别定义main函数,各自单独编译时没问题,但是两个文件作为一个项目来编译gcc a.c b.c -o ab的时候,就会报错(multiple definition of 'main')。为什么会报错?因为a.c和b.c这时候组成了一个程序,而一个程序必须有且只有一个main函数。
3.为什么需要多文件项目?为什么不在一个.c文件中写完所有的功能?
因为一个真正的C语言项目是很复杂的,包含很多个函数,写在一个文件中不利于查找、组织、识别,所以人为的将复杂项目中的很多函数,分成了一个一个的功能模块,然后分开放在不同的.c文件中,于是有了多文件项目。
所以,在b.c中定义的一个函数,很可能a.c中就会需要调用。你在任何一个文件中定义的任何一个函数,都有可能被其他任何一个文件中的函数来调用。但是大家最终都是被main函数调用的,有可能直接调用,也可能是间接调用。间接调用指的是main函数内的一个函数里调用了其他函数。
4.多文件项目中,跨文件调用函数
在调用函数前,要先声明该被调用函数的原型。只要在调用前声明了该函数,那么调用时就好像这个函数是定义在本文件中的函数一样。
总结:函数使用的三大要素——函数定义、函数声明、函数调用
(1)如果没有定义,只有声明和调用,编译时会报连接错误。(undefined reference to 'func_nxx')
(2)如果没有声明,只有定义和调用,编译时一般会报警告,极少数情况下不会报警告。但是最好加上声明。
(3)如果没有调用,只有定义和声明,编译时一般会报警告(有一个函数没有使用),有时不会报警告。这时候程序执行不会出错,只是你白白写了几个函数,而没有使用浪费掉而已。
5.跨文件的变量引用
(1)在a.c中定义的全局变量,在a.c中可以使用,在b.c中不可以直接使用,编译时报错error:'g_a' undeclared。
(2)想在b.c中使用a.c中定义的全局变量,有一个间接的使用方式,在a.c中写一个函数,然后函数中使用a.c中定义的该全局变量,然后在a.c中先声明函数,再使用函数,即可达到在b.c中间接引用a.c中变量的目的。
(3)想在b.c中直接引用a.c中定义的全局变量g_a的声明,这句话告诉编译器,我再外部C程序中(不是本文件的另一个文件)某个地方定义了一个全局变量int g_a,而且我现在要在这里引用(extern int g_a)它告诉编译器一声,不用报错了。
(4)情况分析
① 情况一:我只在b.c中声明变量,但是别的文件中根本就没定义这个变量,会怎样?
编译器报错(连接错误)
不管是函数还是变量,都有定义、声明、引用三要素。其中,定义时创造这个变量或函数,声明是向编译器交代它的原型,引用是使用这个变量或函数。所以,如果没有定义只有声明和引用,编译器一定会报错。
②情况二:在a.c中定义了全局变量g_a,但是b.c中没有声明g_a,引用该变量会怎样?
直接报错,未定义
③情况三:在a.c中定义,在b.c中声明,a.c和b.c都没有引用。
浪费了,未报错。
(5)在一个程序里面,一个函数可以定义一次,引用可以有无数次,声明也可以有无数次。因为函数定义或者变量定义实际上是创造了这个函数、变量,所以只能有一次。(多次创造同名的变量会造成变量名重复、冲突,多次创造同名的函数也会造成函数名重复、冲突)。声明是告诉编译器变量/函数的原型,在每个引用了这个全局变量/函数的文件之前都要声明该变量/函数。
(6)问题一:局部变量能不能跨文件使用?
不能。因为局部变量属于代码块作用域,它的作用域只有他定义的那个函数内部。
问题二:静态局部变量能不能跨文件使用?
不能。因为本质上还是个局部变量。
6.头文件的引入
从之前可以看到,函数的声明是很重要的。当我们在一个庞大的项目中,有很多个源文件,每个源文件中都有很多函数并且需要在各个文件中相互穿插引用函数,怎么解决函数的声明问题?
头文件。如把声明放在a.h文件里,头文件引用#include "a.h"。
(1)#inlcude包含头文件时,用<>和""的区别
<>用来包含系统自带的头文件,系统自带指的是,不是你写的,是编译器或者库函数或者操作系统提供的头文件。""用来包含项目目录中的头文件,这些一般是自己写的,当前目录查找。
(2)防止重复包含头文件

#ifdef  __A_H__
#define  __A_H__
//C语言头文件的声明
#endif

注意:不要在头文件中定义变量,这样容易重复定义,因为头文件容易被许多源文件包含。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,736评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,167评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,442评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,902评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,302评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,573评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,847评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,562评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,260评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,531评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,021评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,367评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,016评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,068评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,827评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,610评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,514评论 2 269

推荐阅读更多精彩内容