`

修饰符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等修饰符的用法" 在C++语言中,extern、volatile、const、static等修饰符都是非常重要的,它们可以影响变量的存储方式、生命周期和访问权限等。本文将详细介绍这些修饰符的用法和特点。 一、const...

    C语言中的类型修饰符

    ### C语言中的类型修饰符详解 #### 一、概述 C语言作为一种静态类型的编程语言,提供了多种类型修饰符来帮助开发者更好地控制变量的行为和特性。本文将详细介绍C语言中的三种重要类型修饰符:`const`、`static` 和...

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

    ### auto、register、static、extern等存储类修饰符的区别 #### 一、标识符的链接(Linkage) 在C语言中,标识符的链接决定了一个变量或者函数可以在哪些范围内被识别和访问。根据链接的不同,我们可以将其分为...

    C#修饰符总结

    - `extern`:外部修饰符,用于引用已存在于其他模块或动态链接库的函数。 4. 实现多态性的修饰符: - `new`:隐藏修饰符,用于隐藏基类的成员。 - `interface`:接口修饰符,用于定义接口,实现多态性。 - `...

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

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

    C#修饰符

    C#修饰符 C#语言中,修饰符是用来定义类、方法、属性、字段等成员的访问权限、行为和特性的关键字。下面将详细介绍C#修饰符。 访问修饰符 访问修饰符用来控制成员的访问权限,包括: * public:存取不受限制。 *...

    C++储存类型修饰符

    根据提供的文件信息,我们可以深入探讨C++中的存储类型修饰符以及与之相关的字符转换方法,尤其是在ANSI与Unicode环境下的转换。尽管标题和描述都简短地提到了“C++存储类型修饰符”,但具体内容涉及了更具体的话题...

    C#修饰符介绍

    C#修饰符介绍 C#修饰符是C#编程语言中的一种关键字,用于定义类、类成员、方法和字段的访问级别、行为和特性。了解C#修饰符的使用可以帮助开发人员更好地编写、维护和重用代码。 一、类定义中可使用的访问修饰符 ...

    使用Visual-Studio-2005创建C#项目案例 c#经典案例.doc

    这里值得注意的是,只有使用修饰符 extern “C” _declspec(dllexport) 修饰的函数才能被 P/Invoke 调用。在该修饰符中,_declspec(DLLexport) 表示输出,即导出函数的定义;extern “C” 表示该函数使用 C 编译方式...

    const,extern,static,volatile的使用

    ### const、extern、static、volatile 的使用详解 #### 一、const 的使用 **1. 为什么使用 const** `const` 关键字在 C 和 C++ 编程语言中非常常见,它用来声明一个常量或者指定某个变量的某个方面为不可变。使用...

    函数的定义和申明

    #### 六、修饰符extern的使用 `extern`关键字主要用于声明外部变量或函数。它可以用来声明一个在当前编译单元之外定义的变量或函数,告诉编译器该变量或函数的存在,但实际上不会为它分配存储空间。 例如: ```...

    C++中的函数修饰符深入讲解

    在C++编程语言中,函数修饰符是用来控制函数行为的关键字。这些修饰符可以在函数声明时添加,以改变函数的特性、行为或访问权限。在本文中,我们将深入探讨C++中的函数修饰符,分为函数名前和函数名后两大类别。 ##...

    C#语言中的修饰符汇总

    2. **extern**:外部修饰符表明方法的实现位于C#源代码之外,例如在非托管代码中。 理解并正确使用这些修饰符是编写高效、安全且易于维护的C#代码的关键。每个修饰符都有其特定的适用场景,选择正确的修饰符可以...

    C语言之extern声明辨析

    extern关键字是C语言中的一种修饰符,用于声明变量或函数的定义在其他文件中。它可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义。 1. extern...

    extern和static的详细用法

    作为局部变量的修饰符 当`static`修饰局部变量时,该变量在其所属函数外部仍然存在,即它具有全局生存期,但在函数内部仍然只可见。 ```c++ void func() { static int count = 0; count++; std::cout ; } ``` ...

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

    这就是`extern`修饰符发挥作用的地方。 `extern`关键字用于在源文件中声明一个已经在其他地方定义的全局变量或函数。它告诉编译器该变量或函数是在其他某个地方定义的,而不是在这个文件中。例如,如果我们有一个...

    C#的关键字大全

    访问修饰符用于修改类型和类型成员的声明,指定声明的类型和类型成员的可访问性。 * public:公共访问修饰符,允许访问的最高级别。 * private:私有访问修饰符,私有访问是允许访问的最低级别,只能在声明它们的类...

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

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

Global site tag (gtag.js) - Google Analytics