关于变量的声明和定义
变量我们很早就讲过,现在再提主要是为了区分变量声明和定义的区别
。我们知道自定义函数有两部分,分为声明部分
和执行语句
,声明是将函数的有关信息告诉编译器。而对与变量而言,声明有两种情况
,一种是需要建立存储空间的
,例如int a=10;
,我们在声明变量 a 的同时,对 a 附加了初始值,建立了对应的存储空间,我们称这种为变量的定义性声明
。另一种是不需要建立存储空间的int a;
,我们称这种为变量的引用性声明
。
1 |
|
我们也可以这么理解,声明可以包括定义,定义不一定包括声明
,我们可以在声明的时候同时定义,但不能说定义就是声明,因为变量需要先声明后定义。
外部变量只能
定义一次
,外部变量的声明有多次
。因为声明是扩大外部变量的作用域范围,而定义则是必须在初始化的时候进行,因为编译器只根据定义分配存储空间
,声明
只是表达变量的作用域范围。
注意
在函数中出现的对变量的声明都是定义,extern 声明除外。
在函数中对其他函数的生命不是函数的定义。
内部函数和外部函数
前面我们知道,变量是有作用域的,我们根据作用域的不同,将变量分为局部变量
和全局变量
。对于函数也有同样的问题。
函数的初衷是需要其他函数来进行调用的,所以,函数默认是可以被所在源文件的函数和其他文件的函数调用的,但是,我们出于某些考虑,也希望函数只能在自己所在的文件被调用,所以这就引出了内部函数
和外部函数
的概念。
内部函数
如果一个函数只能被本文件中的其他函数所调用
,我们就称这个函数为内部函数。
定义一个内部函数
我们可以在定义函数时,在函数类型前面加一个static
告诉编译器这是一个内部函数。
1 | static int test(int a , int b) //在函数的首行前加入 static,表示为内部函数 |
内部函数即代表着,这个函数只能在本文件内被调用
,其他文件无法调用。我们也成内部函数
为静态函数
,因为函数使用static
来声明的。
使用内部函数,只在本文件内可以被调用,即使其他文件有重名的内部函数,在调用时也不会出错。
外部函数
如果在定义是,在函数部首的最前方增加extern
关键字,则表示该函数是一个外部函数
,可以供其他文件调用。
定义一个外部函数
我们可以在定义函数时,在函数类型前面加一个extern
告诉编译器这是一个外部函数,表示可以被其他文件调用。
1 | extern int test (int a, int b) //这样我们就声明了一个可以供其他文件调用的外部函数。 |
在外部文件使用该函数式,跟使用全局变量差不多,需要声明该函数,并且在函数类型前加
extern
关键字。
file1.c 文件1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int main(){
char oldstr[80];
char c;
extern void inputStr(char str[]);
extern void deleteStr(char str[], char c);
extern void printfStr(char ste[]);
//使用 extern 指令将其他文件的函数引用过来
inputStr(oldstr);
printf("请输入要清除的数据:\n");
scanf("%c",&c);
deleteStr(oldstr,c);
printfStr(oldstr);
return 0;
}
file2.c 文件
1 |
|
运行结果
1 | this is a c program |
所以,如果需要使用其他文件的函数
时,首先要求定该函数可以被引用,也就是非内部函数
,然后使用extern
在主调文件中对该函数进行声明。
因为在 C 语言中需要经常调用其他函数,所以我们可以
省略 extern
,直接在文件中声明需要使用的其他文件的函数。
所以,我们可以这么理解函数原型,也就是声明函数时写的那一行。函数原型可以告诉编译器,该函数在本文件的稍后位置或者其他文件内有定义。
尾巴
这是我的个人学习笔记,主要是应付考研复习使用,充斥着一些吐槽和个人观点,并不严谨,欢迎大家参考、指正。