【学习笔记】【C语言】static和extern对函数的作用

如果一个程序中有多个源文件(.c),编译成功会生成对应的多个目标文件(.obj),这些目标文件还不能单独运行,因为这些目标文件之间可能会有关联,比如a.obj可能会调用c.obj中定义的一个函数。将这些相关联的目标文件链接在一起后才能生成可执行文件。

外部函数:如果在当前文件中定义的函数允许其他文件访问、调用,就称为外部函数。C语言规定,不允许有同名的外部函数。
内部函数:如果在当前文件中定义的函数不允许其他文件访问、调用,只能在内部使用,就称为内部函数。C语言规定不同的源文件可以有同名的内部函数,并且互不干扰。

1.static
* 在定义函数时,在函数的最左边加上static可以把该函数声明为内部函数(又叫静态函数),这样该函数就只能在其定义所在的文件中使用。如果在不同的文件中有同名的内部函数,则互不干扰。
* static也可以用来声明一个内部函数
 
2.extern
* 在定义函数时,如果在函数的最左边加上关键字extern,则表示此函数是外部函数,可供其他文件调用。C语言规定,如果在定义函数时省略extern,则隐含为外部函数。
* 在一个文件中要调用其他文件中的外部函数,则需要在当前文件中用extern声明该外部函数,然后就可以使用,这里的extern也可以省略。

3.代码

main.c文件

 1 /*
 2  外部函数:定义的函数能被本文件和其他文件访问
 3  1> 默认情况下所有函数都是外部函数
 4  2> 不允许有同名的外部函数
 5
 6  内部函数:定义的函数只能被本文件访问,其他文件不能访问
 7  1> 允许不同文件中有同名的内部函数
 8
 9  static对函数的作用:
10  1> 定义一个内部函数
11  2> 声明一个内部函数
12
13  extern对函数的作用:
14  1> 完整地定义一个外部函数
15  2> 完整地声明一个外部函数
16  (extern可以省略,默认情况下声明和定义的函数都是外部函数)
17  */
18
19
20 // 声明一个test函数
21 // 完整地声明一个外部函数
22 // extern可以省略
23 //extern void test();
24 void test();
25
26 //void test2();
27
28 int main()
29 {
30     test();
31
32     //test2();
33     return 0;
34 }
35
36 //void test()
37 //{
38 //
39 //}
40 static void test2()
41 {
42
43 }

one.c文件

 1 #include <stdio.h>
 2
 3 // 声明一个内部函数
 4 static void test2();
 5
 6 // 完整地定义一个外部函数
 7 /*
 8 extern void test()
 9 {
10     printf("调用了test函数\n");
11 }*/
12 // 默认情况下,所有的函数都是外部函数,所以可以省略extern
13 void test()
14 {
15     printf("调用了test函数\n");
16
17     test2();
18 }
19
20
21 // 定义一个内部函数
22 static void test2()
23 {
24     printf("调用了test2函数\n");
25 }
时间: 2024-11-04 16:29:51

【学习笔记】【C语言】static和extern对函数的作用的相关文章

static和extern对函数的作用

【学习笔记】【C语言】static和extern对变量的作用

 1.全局变量分2种: 外部变量:定义的变量能被本文件和其他文件访问 1> 默认情况下,所有的全局变量都是外部变量 1> 不同文件中的同名外部变量,都代表着同一个变量  内部变量:定义的变量只能被本文件访问,不能被其他文件访问 1> 不同文件中的同名内部变量,互不影响  static对变量的作用: 定义一个内部变量  extern对变量的作用: 声明一个外部变量  static对函数的作用: 定义和声明一个内部函数  extern对函数的作用: 定义和声明一个外部函数(可以省略) 2.代

iOS学习笔记---c语言第十天

动态内存分配 一.存储区划分 从低到高(内存地址小----内存地址大)  :  代码区---常量区---静态区---堆区---栈区 栈内存 //凡是在函数体内定义的变量 都存储在栈区(包括形参). int a = 10;//a也是在栈区域里面 float b = 1.5;//b也是在栈区域里面 char c = 'b'; double d = 3.14; printf("%p %p %p %p\n",&a,&b,&c,&d); //栈的特点先进后出,先定

iOS学习笔记---c语言第六天

函数  function 命名规范:工程名第一个字母大写,变量函数名小写,不要用拼音和中文, eg:lessonFunction 一.函数声明定义 函数是具有特定功能的代码块        作用:模块化程序 用函数的好处:简化程序.提高开发效率.方便阅读和修改等 函数定义: 返回值类型  函数名(形式参数) { 语句 return 返回值: }     返回值类型:viod  int  char float.....    void下面可以不写return    ,int  下面返回值为整型,c

18-C语言static和extern关键字1-对函数的作用

一.extern与函数 在第三讲和第四讲中,我提到过一句话:如果一个程序中有多个源文件(.c),编译成功会生成对应的多个目标文件(.obj),这些目标文件还不能单独运行,因为这些目标文件之间可能会有关联,比如a.obj可能会调用c.obj中定义的一个函数.将这些相关联的目标文件链接在一起后才能生成可执行文件. 先来理解2个概念: 外部函数:如果在当前文件中定义的函数允许其他文件访问.调用,就称为外部函数.C语言规定,不允许有同名的外部函数. 内部函数:如果在当前文件中定义的函数不允许其他文件访问

iOS学习笔记---c语言第九天

高级指针 指向结构体变量的指针,称为结构体指针 可以使用->指向内容. %p打印地址 void pLenth(cPoint *p1,cPoint *p2) //求两点间的距离  用的开方函数sqrt()和平方函数pow(,) { float a = sqrt(pow((p1->x-p2->x), 2)+pow((p1->y-p2->y), 2)); printf("两点距离为%.2f\n",a); } //main.m中代码 #import <Fou

ios学习笔记---c语言第二天

一.bool布尔类型    c语言没有bool类型,oc里有bool类型 是一种非真即假的数据类型,布尔类型的变量只有yes和no两个值.yes表示表达式是真,no表示表达式是假. 在c语言中认为非0即为真. 分支语句中常用bool值做判断,判断执行if语句还是else语句. 循环结构中,也常使用bool值做判断,判断是否要执行循环. 注意事项: #define yes 1 #define no 0 计算机在识别时,yes就替换成1,no就替换成0. 二.关系运算符 >   >=   <

iOS学习笔记---oc语言第三天

继承.初始化方法 一.继承 继承的上层:父类  继承的下层:子类 继承是单向的,不能相互继承 继承具有传递性:A继承于B,B继承于C,A具有B和C的特征和行为 子类能继承父类全部的特征和行为(私有变量也继承过来了,只是不能访问) 面向对象提供了继承语法.能大大简化代码,把公共的方法和实例对象写在父类里.子类只需要写自己独有的实例变量和方法即可 继承既能保证类的完整,又能简化代码 继承特点 oc中只允许单继承 没有父类的类称为根类,oc中得根类是NSObject(祖宗) 继承的内容:所有的实例变量

IOS学习笔记---C语言第四天

1 //?生成2个数组,每个数组都有10个元素,元素取值范围20-40之间,数组对应元素相 加,放到另外?一个数组中 2 #import <Foundation/Foundation.h> 3 4 int main(int argc, const char * argv[]) 5 { 6 7 int num1[10]={0},num2[10]={0},num3[10]={0}; 8 for (int i = 0; i<10; i++) { 9 num1[i]=arc4random()%2