在C语言颤大中,变量和函数都有数据类型和存储类型两个属性,因此变量定义的一般形式是 {存储类型 数据类型 变量名}
C语言种提供了以岩哗下四种不同的存储类型
那么我们所说的extern就是存储类型的一种。extern修饰的变量存储位置在全局静态存储区。
标准的定义格式: extern 类型名 变量名
通粗洞行俗来说,如果使用extern修饰了一个变量或者函数,那么这个函数或者变量就变成了全局变量,在除定义该变量or函数的文件外仍然有效。不过需要注意的是,使用extern进行修饰是对该变量or函数进行声明,并没有分配内存。
如果在a.c中需要引用b.c中的int i,那么可以在a.c中使用extern int i进行声明。并且,能够被其他模块以extern修饰符引用的变量通常是全局变量。并且extern int i可以被放在a.c中的任何位置,区别只是在a.c中作用域的问题。
从本质上来说,并没有什么区别。函数名字本质上是一个指向二进制块开头处的指针。如果a.c中需要引用b.c中的函数,如b.c中原型是int fun(int mu),那么在a.c中声明extern int fun(int mu)那么就可以在a.c中用fun做事。
但是对其他模块中函数的引用,最常用的方法是包含这些函数声明的头文件。
那么使用extern和包含头文件来引用函数有什么区别如下:
① 使用extern的引用比包含头文件要简介的多。extern使用直截了当,引用哪个函数直接extern进行声明即可。这样做的一个明显的好处是,会加速程序的编译(确切的说是预处理)的过程,节省时间。在大型C程序编译过程中,这种差异是非常明显的。
② include本质上是把include进来的这个文件原封不动的搬到当前文件中
a.c
b.c
是一个修饰符,在C语言中,修饰符extern用在变量或者函数的声明前,用来说明“此变量/函激早察数是明茄在别处定义的,要在此处引用”睁伍。extern可置于变量或者函数前,以表示变量或者函数的定义在别的文件中,提示编译器遇到此变量或函数时,在其它模块中寻找其定义。另外,extern也可用来进行链接指定。
在头文件中声明函数时,前面的extern可有可无,只要这些函数曾在某个.c文件中实现就行了,不过一些函数没有在所包含的头文件中给出声明,同时函数的定义位于其它文件中,这时候使用该函数的.c文件必须用extern标记该函数为外部函数。例子:
/* c.h */extern int max(int a, int b)
extern int min(int a, int b)
/* a.c */
#include <stdio.h>
/* 这里需要明确指定output为extern函数 */
extern void output()
int max(int a, int b)
{
return (a > b ? a : b)
}
int min(int a, int b)
{
return (a < b ? a : b)
}
void main()
{
output()
}
/* b.c */
#include "c.h"
void output()
{
printf("%d %d\n", max(10, 5), min(10, 5))
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)