include 与 什么情况用什么 extern (include)

本文目录导航:

extern 与 include ,什么情况用什么?

extern只是声明全局变量 这个变量可以在其他文件里定义(函数也一样)include一般只是包含头文件,该头文件可以有extern声明的变量或函数,这样c文件里就可以直接调用这些变量或函数,而不必自己定义(这些变量或函数在其他文件定义好了)

include 与 什么情况用什么 extern (include)

C语言中全局变量说明符extern该如何使用?

c++中的extern修饰符在变量的 声明和定义方面有什么作用

在C语言中,修饰符extern用在变量或者函数的声明前,用来说明“此变量/函数是在别处定义的,要在此处引用”。

1. extern修饰变量的声明。

举例来说,如果文件a.c需要引用b.c中变量int v,就可以在a.c中声明extern int v,然后就可以引用变量v。

这里需要注意的是,被引用的变量v的链接属性必须是外链接(external)的,也就是说a.c要引用到v,不只是取决于在a.c中声明extern int v,还取决于变量v本身是能够被引用到的。

这涉及到c语言的另外一个话题--变量的作用域。

能够被其他模块以extern修饰符引用到的变量通常是全局变量。

还有很重要的一点是,extern int v可以放在a.c中的任何地方,比如你可以在a.c中的函数fun定义的开头处声明extern int v,然后就可以引用到变量v了,只不过这样只能在函数fun作用域中引用v罢了,这还是变量作用域的问题。

对于这一点来说,很多人使用的时候都心存顾虑。

好像extern声明只能用于文件作用域似的。

2. extern修饰函数声明。

从本质上来讲,变量和函数没有区别。

函数名是指向函数二进制块开头处的指针。

如果文件a.c需要引用b.c中的函数,比如在b.c中原型是int fun(int mu),那么就可以在a.c中声明extern int fun(int mu),然后就能使用fun来做任何事情。

就像变量的声明一样,extern int fun(int mu)可以放在a.c中任何地方,而不一定非要放在a.c的文件作用域的范围中。

对其他模块中函数的引用,最常用的方法是包含这些函数声明的头文件。

使用extern和包含头文件来引用函数有什么区别呢?extern的引用方式比包含头文件要简洁得多!extern的使用方法是直接了当的,想引用哪个函数就用extern声明哪个函数。

这大概是KISS原则的一种体现吧!这样做的一个明显的好处是,会加速程序的编译(确切的说是预处理)的过程,节省时间。

在大型C程序编译过程中,这种差异是非常明显的。

3. 此外,extern修饰符可用于指示C或者C++函数的调用规范。

比如在C++中调用C库函数,就需要在C++程序中用extern “C”声明要引用的函数(只有C++才有extern “C”的用法,在C中这样用会报错)。

这是给链接器用的,告诉链接器在链接的时候用C函数规范来链接。

主要原因是C++和C程序编译完成后在目标代码中命名规则不同。

4.对于extern变量来说,仅仅是一个变量的声明,其并不是在定义分配内存空间。

如果该变量定义多次,会有连接错误。

extern用在变量声明中常常有这样一个作用,你在*.c文件中定义了一个全局的变量,这个全局的变量如果要被引用,就放在*.h中并用extern来声明。

是C/C++语言中表明函数和全局变量作用范围(可见性)的关键字,该关键字告诉编译器,其声明的函数和变量可以在本模块或其它模块中使用。

通常,在模块的头文件中对本模块提供给其它模块引用的函数和全局变量以关键字extern声明。

也就是说c文件里面定义函数和变量,如果该函数或者变量欲开放给外部文件,则在h文件中用extern加以声明。

则外部文件只需include该h文件就可以了。

而且编译阶段,外部文件是找不到该函数或者变量的,但是不报错。

link阶段会从原先模块生成的目标代码中找到此函数和变量。

6.函数的声明默认是extern的,如果函数的声明中带有关键字extern,仅仅是暗示这个函数可能在别的源文件里定义,没有其它作用。

即下述两个函数声明没有明显区别: extern intf(); 和int f(); 当然,这样的用处还是有的,就是在程序中取代include “*.h”来声明函数,在一些复杂的项目中,在所有的函数声明前添加extern修饰是一种比较好的习惯。

如果定义函数的c/cpp文件在对应的头文件中声明了定义的函数,那么在其他c/cpp文件中要使用这些函数,只需要包含这个头文件即可。

如果你不想包含头文件,那么在c/cpp中声明该函数。

一般来说,声明定义在本文件的函数不用“extern”,声明定义在其他文件中的函数用“extern”,这样在本文件中调用别的文件定义的函数时就不用包含头文件include “*.h”来声明函数,声明后直接使用即可。

7.如果在模块A中函数声明了foo(int x,int y)为extern C类型,而模块B中包含的是extern int foo( int x, int y ) ,则模块B找不到模块A中的函数;反之亦然。

你可能想看:
« 上一篇
下一篇 »

相关推荐

FreeBasic:强大免费开源的64位basic编译器及应用优势

2025年05月10日

82阅读

脊柱侧弯矫正方法大盘点:运动康复、支具矫正等多种方式

2025年05月09日

87阅读

如何在winForm标题栏去掉标题文字且任务栏图标正常显示

2025年05月09日

86阅读

十一黄金周促销广告词大全,国庆购物狂欢等你来

2025年05月09日

77阅读

关闭快速编辑模式及插入模式,设置控制台指定文字颜色举例

2025年05月09日

63阅读

黄金搭档低糖高钙饮品包装及成分功效全解析,适合人群要知晓

2025年05月09日

91阅读