`

修饰符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函数规范来链接。主要原因是C++和C程序编译完成后在目标代码中命名规则不同。

分享到:
评论

相关推荐

    extern_volatile等修饰符的用法

    extern_volatile等修饰符的用法

    auto、register、static、extern等存储类修饰符的区别.

    auto、register、static、extern等存储类修饰符的区别.

    c语言面试经常提问到的几个修饰符

    extern:修饰符:修饰变量,函数。修饰变量时候,变量的声明在外面,修饰函数的时候,如果函数已经声明,则作用不是很大。 const:修饰符:修饰变量,函数。修饰变量时候,不能被重复赋值,只能放在只读段中。修饰...

    const,extern,static,volatile的使用

    const,extern,static,volatile的使用

    c代码-extern 修饰符用于当有两个或多个文件共享相同的全局变量或函数的时候

    c代码-extern 修饰符用于当有两个或多个文件共享相同的全局变量或函数的时候

    iOS 各种修饰符的区别汇总(推荐)

    atomic 设置成员变量的@property属性时,默认为atomic,提供多线程安全。 在多线程环境下,原子操作是必要的,否则有可能引起错误的结果。加了atomic,setter函数会变成下面这样: {lock} if (property !...

    C#25个问题 静态成员和非静态成员的区别等等

    5.internal 修饰符起什么作用? 6.sealed 修饰符是干什么的? 7.override 和 overload 的区别? 8.什么是索引指示器? 9.new 修饰符是起什么作用? 10.this 关键字的含义? 11.可以使用抽象函数重写基类中的虚函数吗...

    c++中的static修饰符示例详解

    本文主要给大家介绍了关于c++中static修饰符的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。 下面一段是引用自effective c++ 中的一句话: 所谓的static对象,其寿命是从构造出来到...

    apply-pub-rs:一个 Rust 语法扩展,用于将 `pub` 可见性修饰符一次应用于多个项目

    一个 Rust 语法扩展,用于一次将pub可见性修饰符应用于许多项目。 现在,该属性适用于每个可能具有公共可见性的子 AST 元素,包括: use static fn ,独立的和方法/关联的 mod type 、 struct和enum trait ...

    第7章数组1

    声明形式[存储类型说明符] [类型修饰符] 类型说明符 数组名[常量表达式]={初值表};存储类型说明符:extern、static类型修饰符:const、vo

    C#基础概念二十五问

    5.internal 修饰符起什么作用? 6.sealed 修饰符是干什么的? 7.override 和 overload 的区别? 8.什么是索引指示器? 9.new 修饰符是起什么作用? 10.this 关键字的含义? 11.可以使用抽象函数重写基类中的虚函数吗...

    C#的25个问题(内附代码示例)

    5.internal 修饰符起什么作用? 6.sealed 修饰符是干什么的? 7.override 和 overload 的区别? 8.什么是索引指示器? 9.new 修饰符是起什么作用? 10.this 关键字的含义? 11.可以使用抽象函数重写基类中的虚函数吗...

    你必须知道的C#的25个基础概念(附源码)

    答:静态变量:静态变量使用 static 修饰符进行声明在所属类被装载时创建通过类进行访问所属类的所有实例的同一静态变量都是同一个值非静态变量:不带有 static 修饰符声明的变量称做非静态变量在类被实例化时创建...

    C#基础概念.doc

    5、internal 修饰符起什么作用? 6、sealed 修饰符是干什么的? 7、override 和 overload 的区别? 9、new 修饰符是起什么作用? 10、this 关键字的含义? 11、可以使用抽象函数重写基类中的虚函数吗? 12、密封类...

    常见 ASP.NET 概念(开源,说明)

    5.internal 修饰符起什么作用? 6.sealed 修饰符是干什么的? 7.override 和 overload 的区别? 8.什么是索引指示器? 9.new 修饰符是起什么作用? 10.this 关键字的含义? 11.可以使用抽象函数重写基类中的虚函数吗...

    c#基础学习问答c#基础学习问答

    5.internal 修饰符起什么作用? 6.sealed 修饰符是干什么的? 7.override 和 overload 的区别? 8.什么是索引指示器? 9.new 修饰符是起什么作用? 10.this 关键字的含义? 11.可以使用抽象函数重写基类中的虚函数吗...

    C++调用C函数实例详解

    首先,为什么要使用extern “C”修饰符? C++调用其它语言的函数,由于编译器生成函数的机制不一样,所以需要经过特殊处理,才可以调用。调用C语言的函数,需要在函数声明的地方语句extern “C”。如果不使用该语句...

Global site tag (gtag.js) - Google Analytics