`
weiyinchao88
  • 浏览: 1235030 次
文章分类
社区版块
存档分类
最新评论

c/c++ extern的用处详解

 
阅读更多
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来声明。

  3 问题:extern 函数1

  常常见extern放在函数的前面成为函数声明的一部分,那么,C语言的关键字extern在函数的声明中起什么作用?

  答案与分析:

  如果函数的声明中带有关键字extern,仅仅是暗示这个函数可能在别的源文件里定义,没有其它作用。即下述两个函数声明没有明显的区别:

extern int f(); 和int f();

  当然,这样的用处还是有的,就是在程序中取代include “*.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 */
分享到:
评论

相关推荐

    华为C/C++笔试最全试题

    ### 华为C/C++笔试知识点详解 #### 静态关键字的作用 在C语言中,`static`关键字具有多重用途: 1. **在函数体内**:声明为静态的变量在其所在函数调用过程中保持其值不变,即使函数执行完毕返回后,其值也不会...

    实例详解C/C++中extern关键字

    C/C++语言中的extern关键字是一个非常重要的关键字,它有两个主要的用途:一是用于声明变量或函数定义在别的文件中;二是在C++中用于指示编译器按照C语言的命名规则来编译函数名。 首先,当extern关键字用于变量或...

    extern用法详解

    `extern "C"`的作用是告诉C++编译器使用C语言的链接规则。 例如,在一个C++项目中使用C库函数时,可以在头文件中这样声明: ```cpp #ifdef __cplusplus extern "C" { #endif // C函数声明 int my_c_function(int ...

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

    3. **C++中的extern "C"**:在C++中,`extern "C"`用于指定函数调用的C语言规范,这是因为C++的名称修饰(name mangling)与C不同。在C++程序中调用C库函数时,需用`extern "C"`包裹函数声明,以确保链接时使用正确...

    [面试/笔试系列9]C/C++经典面试题

    ### C/C++经典面试题详解 #### 面试题1:变量的声明和定义有什么区别? **声明**和**定义**是C/C++中非常重要的概念。了解它们之间的区别对于编写高质量的代码至关重要。 - **定义**: 当我们说一个变量被定义时,...

    C/C++笔试题

    ### C/C++ 笔试题详解 #### 1. `volatile` 是什么? `volatile` 是一个关键字,在 C/C++ 中用来修饰变量。当一个变量被声明为 `volatile` 类型时,编译器不会对它进行优化(例如,将它保存在寄存器中而不是内存中...

    华为笔试C/C++

    ### C/C++ 笔试知识点详解 #### Static关键字的用途 1. **在函数体内**:当一个变量被声明为`static`时,在该函数多次被调用的过程中,该变量的值将保持不变。通常情况下,函数内部定义的变量会在函数执行完毕后...

    华为C/C++笔试题

    - `extern "C"`用于在C++代码中声明C语言编译的函数,避免名称修饰问题。 17. switch()不允许的数据类型: - 实型(浮点数)不能作为switch的控制表达式。 18. 动态内存分配: - `GetMemory`函数动态分配内存并...

    C_C++面试题目

    ### C/C++ 面试知识点详解 #### 1. `static` 关键字的用途 - **限制变量的作用域**:当在一个函数内部定义一个带有 `static` 的局部变量时,该变量的作用域仍然局限在该函数内部,但生命周期会持续到程序结束。这...

    C++课程-高质量C++编程_课时_大纲

    - **1.1 C++的历史与背景**:介绍C++的起源,对比C语言,理解面向对象编程(OOP)的概念。 - **1.2 C++的版本与标准**:讲解C++的不同版本(C++98, C++11, C++14, C++17, C++20等),理解标准库的重要性和作用。 ##...

    C++中的extern声明变量详解

    本篇将详细解释`extern`声明变量的概念和用途。 首先,理解声明(Declaration)和定义(Definition)至关重要。声明告诉编译器变量或函数的存在,而定义则分配实际的内存并初始化变量或实现函数的主体。一个变量...

    嵌入式C语言精华文章集锦

    - 解释`extern "C"`的意义及其在C++中的用途。 - 探讨如何在C++中使用C语言库。 - 分析在混合C/C++编程环境中使用`extern "C"`的重要性。 3. **C语言高效编程的几招** - 提供实用的技巧以提高C语言代码的效率。...

    extern和static的详细用法

    - **作用一**:与`"C"`连用时,用于指示编译器以C语言的方式编译函数名,而非C++默认的方式。C++支持函数重载,因此如果不使用`extern "C"`,在不同编译单元间调用C库函数可能会导致链接错误。 ```c++ extern "C" ...

    嵌入式C&C++语言精华文章集锦

    - **C和C++混合编程**:当C++程序需要调用C语言库或者函数时,为了保持兼容性,通常会在函数声明前加上 `extern "C"`。 - **防止名称修饰**:C++编译器会对函数名称进行修饰(Name Mangling),而C语言不会。使用 `...

    嵌入式C精华

    - **extern "C"的含义**:在C++中,`extern "C"`用于告诉编译器按照C语言的方式链接符号,主要用于解决C++与C混合编程时的链接问题。 - **应用场景**: - 当在C++项目中调用C库时。 - 在C++中定义供C程序使用的...

Global site tag (gtag.js) - Google Analytics