C语言 extern

C语言 extern,第1张

在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))

}

用extern声明的函数或变量成碧桐为外部函数或外部变量,用来告诉编译器该函数或变量来自外部文件,当遇到extern声明的函数或变量时,编译器就会到外部文件,即定义这个函樱脊数或变量的c文件里寻脊慧渗找进行编译。详见http://www.cnblogs.com/RealOnlyme/archive/2012/03/15/2398320.html


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/12152540.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-21
下一篇 2023-05-21

发表评论

登录后才能评论

评论列表(0条)

保存