`
zhengweizhong
  • 浏览: 75362 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

extern用法详解(转)

    博客分类:
  • C++
 
阅读更多

1 基本解释
  extern可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义。
  另外,extern也可用来进行链接指定。

2 问题:extern 变量
  在一个源文件里定义了一个数组:char a[6];
  在另外一个文件里用下列语句进行了声明:extern char *a;
  请问,这样可以吗? 
  答案与分析:
  1)、不可以,程序运行时会告诉你非法访问。原因在于,指向类型T的指针并不等价于类型T的数组。extern char *a声明的是一个指针变量而不是字符数组,因此与实际的定义不同,从而造成运行时非法访问。应该将声明改为extern char a[ ]。
  2)、例子分析如下,如果a[] = "abcd",则外部变量a=0x61626364 (abcd的ASCII码值),*a显然没有意义
  显然a指向的空间(0x61626364)没有意义,易出现非法内存访问。
  3)、这提示我们,在使用extern时候要严格对应声明时的格式,在实际编程中,这样的错误屡见不鲜。
  4)、extern用在变量声明中常常有这样一个作用,你在*.c文件中声明了一个全局的变量,这个全局的变量如果要被引用,就放在*.h中并用extern来声明。


4 问题:extern 函数2
  当函数提供方单方面修改函数原型时,如果使用方不知情继续沿用原来的extern申明,这样编译时编译器不会报错。但是在运行过程中,因为少了或者多了输入参数,往往会照成系统错误,这种情况应该如何解决?
  答案与分析:
  目前业界针对这种情况的处理没有一个很完美的方案,通常的做法是提供方在自己的xxx_pub.h中提供对外部接口的声明,然后调用方include该头文件,从而省去extern这一步。以避免这种错误。
  宝剑有双锋,对extern的应用,不同的场合应该选择不同的做法。

5 问题:extern “C”
  在C++环境下使用C函数的时候,常常会出现编译器无法找到obj模块中的C函数定义,从而导致链接失败的情况,应该如何解决这种情况呢?

  答案与分析:
  C++语言在编译的时候为了解决函数的多态问题,会将函数名和参数联合起来生成一个中间的函数名称,而C语言则不会,因此会造成链接时找不到对应函数的情况,此时C函数就需要用extern “C”进行链接指定,这告诉编译器,请保持我的名称,不要给我生成用于链接的中间函数名。
  下面是一个标准的写法:
//在.h文件的头上
#ifdef __cplusplus
#if __cplusplus
extern "C"{
 #endif
 #endif /* __cplusplus */ 
 …
 …
 //.h文件结束的地方
 #ifdef __cplusplus
 #if __cplusplus
}
#endif
#endif /* __cplusplus */

3 问题:extern 函数1
  常常见extern放在函数的前面成为函数声明的一部分,那么,C语言的关键字extern在函数的声明中起什么作用?
  答案与分析:
  如果函数的声明中带有关键字extern,仅仅是暗示这个函数可能在别的源文件里定义,没有其它作用。即下述两个函数声明没有明显的区别:
extern int f(); 和int f();
  当然,这样的用处还是有的,就是在程序中取代include “*.h”来声明函数,在一些复杂的项目中,我比较习惯在所有的函数声明前添加extern修饰。

分享到:
评论

相关推荐

    extern用法详解.doc

    extern 用法详解 extern 是 C 语言中的一个关键字,用于声明变量或函数在其他文件中定义。下面是对 extern 用法的详细解释: 1. 基本解释 extern 可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中...

    extern用法详解extern用法详解extern用法详解extern用法详解

    ### extern关键字详解 在C和C++编程语言中,`extern`关键字的使用十分关键,尤其是在涉及多个源文件的项目中。它主要用于声明一个变量或函数的定义位于其他地方,通常是在另一个源文件中。这使得不同的源文件可以...

    C++ extern用法

    C++ extern 用法详解 C++ 语言中的 extern 关键字是一种重要的语法元素,它可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义。以下是对 C++ 中...

    关于externC的超详解

    `extern "C"`的用法通常有两种情况: 1. **导入C库到C++程序**:当我们在C++中使用C编写的库时,需要告诉编译器这些函数是按照C的方式来命名的。例如: ```cpp extern "C" { #include "c_library.h" // C库的...

    C语言中extern用法

    extern用法详解 extern是一个C语言中的关键字,它可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义。 基本概念 ---- extern的基本用法是将...

    C++中的extern “C”用法详解

    1. 声明:在C++代码中,如果要引用C语言编译的库函数,需要使用`extern "C"` 声明,告诉编译器这部分函数应按照C的方式来处理。例如: ```cpp extern "C" { void c_language_function(void); } ``` 2. 定义:同样,...

    extern和static的详细用法

    ### extern和static的详细用法 #### 一、引言 在编程中,尤其是在C/C++这类语言中,`extern`和`static`是两个重要的关键字,它们在控制变量的作用域以及链接可见性方面扮演着关键角色。正确理解和运用这两个关键字...

    C语言extern关键字的用法

    ### C语言extern关键字的用法 #### 一、引言 在C语言中,`extern`关键字主要用于在多个源文件之间共享变量或函数定义。它允许程序员在一个源文件中声明一个变量或函数,并且该变量或函数的实际定义位于另一个...

    const 用法详解

    ### const 用法详解 #### 一、引言 `const`关键字在C++中扮演着极其重要的角色,它不仅可以帮助提高代码的安全性和可维护性,还能增强编译时的类型检查能力。本文将深入探讨`const`的各种用法及其背后的原理,包括...

    extern在C和C++中的作用

    在程序设计领域,尤其是在C和C++这两种广泛使用的编程语言中,理解和掌握关键字`extern`的使用方法至关重要。`extern`关键字用于声明一个变量或函数是在当前源文件之外定义的。这有助于在多个源文件之间共享数据和...

    C语言extern方法总结

    ### C语言中的`extern`关键字详解 #### 一、引言 在C语言中,`extern`关键字主要用于声明全局变量和函数,它帮助程序在不同的源文件之间共享数据和功能。本文将详细介绍`extern`关键字的基本用法及其背后的原理,这...

    const,extern,static,volatile的使用

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

    const用法详解

    ### const用法详解 #### 一、概述 `const` 是 C++ 中一个非常重要的关键字,它用于声明常量或指定对象的某些属性为只读。相比于 C 语言中的 `#define` 宏定义,`const` 提供了更强大的功能和更好的类型安全性。...

    详解C语言正确使用extern关键字

    下面将通过实例代码详细介绍extern关键字的使用方法和注意事项。 一、引用同一个文件中的变量 在一个文件中,变量的声明和初始化的顺序对编译器的编译结果有很大的影响。如果变量的声明和初始化放在main函数的后边...

    浅谈C/C++中的static与extern关键字的使用详解

    2. **加速编译**:使用`extern`声明变量或函数,可以避免重复定义,从而加快编译速度。如果直接`#include`另一个文件,编译器会读取整个文件,而`extern`只需声明。 3. **C++中的extern "C"**:在C++中,`extern "C...

    c语言const的用法详解

    ### c语言const的用法详解 #### 一、概述 `const`关键字是C语言中的一个非常重要的概念,主要用于声明不可变的变量或指针。...总之,熟练掌握`const`的使用方法对于提高编程水平是非常有帮助的。

Global site tag (gtag.js) - Google Analytics