【学习笔记】【C语言】static和extern对函数的作用
2015-07-05 18:26
573 查看
如果一个程序中有多个源文件(.c),编译成功会生成对应的多个目标文件(.obj),这些目标文件还不能单独运行,因为这些目标文件之间可能会有关联,比如a.obj可能会调用c.obj中定义的一个函数。将这些相关联的目标文件链接在一起后才能生成可执行文件。
外部函数:如果在当前文件中定义的函数允许其他文件访问、调用,就称为外部函数。C语言规定,不允许有同名的外部函数。
内部函数:如果在当前文件中定义的函数不允许其他文件访问、调用,只能在内部使用,就称为内部函数。C语言规定不同的源文件可以有同名的内部函数,并且互不干扰。
1.static
* 在定义函数时,在函数的最左边加上static可以把该函数声明为内部函数(又叫静态函数),这样该函数就只能在其定义所在的文件中使用。如果在不同的文件中有同名的内部函数,则互不干扰。
* static也可以用来声明一个内部函数
2.extern
* 在定义函数时,如果在函数的最左边加上关键字extern,则表示此函数是外部函数,可供其他文件调用。C语言规定,如果在定义函数时省略extern,则隐含为外部函数。
* 在一个文件中要调用其他文件中的外部函数,则需要在当前文件中用extern声明该外部函数,然后就可以使用,这里的extern也可以省略。
3.代码
main.c文件
one.c文件
外部函数:如果在当前文件中定义的函数允许其他文件访问、调用,就称为外部函数。C语言规定,不允许有同名的外部函数。
内部函数:如果在当前文件中定义的函数不允许其他文件访问、调用,只能在内部使用,就称为内部函数。C语言规定不同的源文件可以有同名的内部函数,并且互不干扰。
1.static
* 在定义函数时,在函数的最左边加上static可以把该函数声明为内部函数(又叫静态函数),这样该函数就只能在其定义所在的文件中使用。如果在不同的文件中有同名的内部函数,则互不干扰。
* static也可以用来声明一个内部函数
2.extern
* 在定义函数时,如果在函数的最左边加上关键字extern,则表示此函数是外部函数,可供其他文件调用。C语言规定,如果在定义函数时省略extern,则隐含为外部函数。
* 在一个文件中要调用其他文件中的外部函数,则需要在当前文件中用extern声明该外部函数,然后就可以使用,这里的extern也可以省略。
3.代码
main.c文件
/* 外部函数:定义的函数能被本文件和其他文件访问 1> 默认情况下所有函数都是外部函数 2> 不允许有同名的外部函数 内部函数:定义的函数只能被本文件访问,其他文件不能访问 1> 允许不同文件中有同名的内部函数 static对函数的作用: 1> 定义一个内部函数 2> 声明一个内部函数 extern对函数的作用: 1> 完整地定义一个外部函数 2> 完整地声明一个外部函数 (extern可以省略,默认情况下声明和定义的函数都是外部函数) */ // 声明一个test函数 // 完整地声明一个外部函数 // extern可以省略 //extern void test(); void test(); //void test2(); int main() { test(); //test2(); return 0; } //void test() //{ // //} static void test2() { }
one.c文件
#include <stdio.h> // 声明一个内部函数 static void test2(); // 完整地定义一个外部函数 /* extern void test() { printf("调用了test函数\n"); }*/ // 默认情况下,所有的函数都是外部函数,所以可以省略extern void test() { printf("调用了test函数\n"); test2(); } // 定义一个内部函数 static void test2() { printf("调用了test2函数\n"); }
相关文章推荐
- C++基于该模型模板包括节目外实例
- C语言中的位操作
- C语言学习笔记:14_内部函数和外部函数
- C++知识点随笔(一):this指针、拷贝构造函数、初始化列表
- 从C语言角度看OC编程里类、类对象
- C语言学习笔记:13_变量和函数的声明与定义
- C语言学习笔记:12_变量的存储方式和生存期
- 【C语言】printf函数和scanf函数典型例子
- C语言-共用体
- C++11初探
- 【C++】通用单链表
- c++ const 类型转化初始化
- 【C/C++学习笔记】memmove()、memcpy()、memccpy()、strcpy()函数整理
- C++一些注意事项
- C语言程序的gcc翻译步骤
- 让c++ 函数返回一个数组
- LRU Cache的C++实现
- 为什么C++编译器不能支持对模板的分离式编译
- Karatsuba 乘法
- c++11特性