C语言中的函数-变量、内部函数和外部函数-学习笔记-22

关于变量的声明和定义

变量我们很早就讲过,现在再提主要是为了区分变量声明和定义的区别。我们知道自定义函数有两部分,分为声明部分执行语句,声明是将函数的有关信息告诉编译器。而对与变量而言,声明有两种情况,一种是需要建立存储空间的,例如int a=10;,我们在声明变量 a 的同时,对 a 附加了初始值,建立了对应的存储空间,我们称这种为变量的定义性声明。另一种是不需要建立存储空间的int a;,我们称这种为变量的引用性声明

1
2
3
4
5
#include <stdio.h>
int main(){
int a=1; //我们称之为定义性声明
int b; //我们称这种没有赋值或者说没有建立存储空间的为引用性声明
}

我们也可以这么理解,声明可以包括定义,定义不一定包括声明,我们可以在声明的时候同时定义,但不能说定义就是声明,因为变量需要先声明后定义。

外部变量只能定义一次,外部变量的声明有多次。因为声明是扩大外部变量的作用域范围,而定义则是必须在初始化的时候进行,因为编译器只根据定义分配存储空间声明只是表达变量的作用域范围。

注意
在函数中出现的对变量的声明都是定义,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
#include <stdio.h>
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <stdio.h>
void inputStr (char str[]){
gets(str);
}
void deleteStr(char str[], char c){
int i,j;
for(i=j=0;str[i]!='\0';i++){
if(str[i]!=c){
str[j++]=str[i];
}
}
str[j]='\0';
}
void printfStr(char str[]){
printf("%s\n",str);
}

运行结果

1
2
3
4
5
this is a c program
请输入要清除的数据:

thisisacprogram
Program ended with exit code: 0

所以,如果需要使用其他文件的函数时,首先要求定该函数可以被引用,也就是非内部函数,然后使用extern在主调文件中对该函数进行声明。

因为在 C 语言中需要经常调用其他函数,所以我们可以省略 extern,直接在文件中声明需要使用的其他文件的函数。

所以,我们可以这么理解函数原型,也就是声明函数时写的那一行。函数原型可以告诉编译器,该函数在本文件的稍后位置或者其他文件内有定义。

尾巴

这是我的个人学习笔记,主要是应付考研复习使用,充斥着一些吐槽和个人观点,并不严谨,欢迎大家参考、指正。


-------------The End-------------
欢迎请我喝咖啡哦~!