1 基本解释 extern可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义。
另外,extern也可用来进行链接指定。
2 问题:extern 变量
在一个源文件里定义了一个数组:
在另外一个文件里用下列语句进行了声明:
请问,这样可以吗?
答案与分析:
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语言中,`static`关键字具有多重用途: 1. **在函数体内**:声明为静态的变量在其所在函数调用过程中保持其值不变,即使函数执行完毕返回后,其值也不会...
C/C++语言中的extern关键字是一个非常重要的关键字,它有两个主要的用途:一是用于声明变量或函数定义在别的文件中;二是在C++中用于指示编译器按照C语言的命名规则来编译函数名。 首先,当extern关键字用于变量或...
`extern "C"`的作用是告诉C++编译器使用C语言的链接规则。 例如,在一个C++项目中使用C库函数时,可以在头文件中这样声明: ```cpp #ifdef __cplusplus extern "C" { #endif // C函数声明 int my_c_function(int ...
3. **C++中的extern "C"**:在C++中,`extern "C"`用于指定函数调用的C语言规范,这是因为C++的名称修饰(name mangling)与C不同。在C++程序中调用C库函数时,需用`extern "C"`包裹函数声明,以确保链接时使用正确...
### C/C++经典面试题详解 #### 面试题1:变量的声明和定义有什么区别? **声明**和**定义**是C/C++中非常重要的概念。了解它们之间的区别对于编写高质量的代码至关重要。 - **定义**: 当我们说一个变量被定义时,...
### C/C++ 笔试题详解 #### 1. `volatile` 是什么? `volatile` 是一个关键字,在 C/C++ 中用来修饰变量。当一个变量被声明为 `volatile` 类型时,编译器不会对它进行优化(例如,将它保存在寄存器中而不是内存中...
### C/C++ 笔试知识点详解 #### Static关键字的用途 1. **在函数体内**:当一个变量被声明为`static`时,在该函数多次被调用的过程中,该变量的值将保持不变。通常情况下,函数内部定义的变量会在函数执行完毕后...
- `extern "C"`用于在C++代码中声明C语言编译的函数,避免名称修饰问题。 17. switch()不允许的数据类型: - 实型(浮点数)不能作为switch的控制表达式。 18. 动态内存分配: - `GetMemory`函数动态分配内存并...
### C/C++ 面试知识点详解 #### 1. `static` 关键字的用途 - **限制变量的作用域**:当在一个函数内部定义一个带有 `static` 的局部变量时,该变量的作用域仍然局限在该函数内部,但生命周期会持续到程序结束。这...
- **1.1 C++的历史与背景**:介绍C++的起源,对比C语言,理解面向对象编程(OOP)的概念。 - **1.2 C++的版本与标准**:讲解C++的不同版本(C++98, C++11, C++14, C++17, C++20等),理解标准库的重要性和作用。 ##...
本篇将详细解释`extern`声明变量的概念和用途。 首先,理解声明(Declaration)和定义(Definition)至关重要。声明告诉编译器变量或函数的存在,而定义则分配实际的内存并初始化变量或实现函数的主体。一个变量...
- 解释`extern "C"`的意义及其在C++中的用途。 - 探讨如何在C++中使用C语言库。 - 分析在混合C/C++编程环境中使用`extern "C"`的重要性。 3. **C语言高效编程的几招** - 提供实用的技巧以提高C语言代码的效率。...
- **作用一**:与`"C"`连用时,用于指示编译器以C语言的方式编译函数名,而非C++默认的方式。C++支持函数重载,因此如果不使用`extern "C"`,在不同编译单元间调用C库函数可能会导致链接错误。 ```c++ extern "C" ...
- **C和C++混合编程**:当C++程序需要调用C语言库或者函数时,为了保持兼容性,通常会在函数声明前加上 `extern "C"`。 - **防止名称修饰**:C++编译器会对函数名称进行修饰(Name Mangling),而C语言不会。使用 `...
- **extern "C"的含义**:在C++中,`extern "C"`用于告诉编译器按照C语言的方式链接符号,主要用于解决C++与C混合编程时的链接问题。 - **应用场景**: - 当在C++项目中调用C库时。 - 在C++中定义供C程序使用的...