extern 关键字常用来修饰变量和方法,表示对该变量和方法的声明及引用。下面用几个代码实例做详细介绍。
c/c++代码中的extern关键字
引用同文件中的变量和方法
mian.c
//声明变量和方法
extern int iCount;
extern void printCount();
int main(){
iCount = 2;
printCount();
}
//定义变量
int iCount = 1;
void printCount(){
printf("iCount=%d\n", iCount);
}
说明:extern关键字表示方法和变量在其它地方有定义,此处只是声明。在此次iCount变量和printCount方法在mian方法后定义和实现。注意此处extern int iCount 和extren void printCount中的extern关键字可以去掉,去掉不会报重定义错误,但是如果将extern int iCount 改成 extern int iCount = 0,则会报重复定义错误。
引用不同文件中的变量和方法
testExtern.c
//定义变量
int iCount = 1;
//定义方法
void printCount(){
iCount++;
printf("iCount=%d\n", iCount);
}
main.c
//声明变量
extern int iCount ;
//声明方法
extern void printCount();
int main(){
iCount++;
printCount();
}
说明:在testExtern.c文件中我们定义了一个变量和一个方法,在main.c文件中我们可以通过extern关键字,表示变量和方法在其他地方定义和实现,在该文件只是一个声明和使用。注意:一个变量只能是全局变量才能被其它地方引用。例如本例子如果将testExtern.c中的iCount 变量的定义放到printCount方法内部,则会出现编译错误,找不到该变量。
extern “c”在c/c++混编中的使用
如果一个C语言实现的代码模块,要在c++中使用,c语言对应的头文件常用格式如下:
#ifdef __cplusplus
extern "C" {
#endif
/**** some declaration or so *****/
#ifdef __cplusplus
}
#endif /* end of __cplusplus */
说明:这是为了让CPP能够与C接口而采用的一种语法形式。之所以采用这种方式,是因为两种语言之间的一些差异所导致的。由于CPP支持多态性,也就是具有相同函数名的函数可以完成不同的功能,CPP通常是通过参数区分具体调用的是哪一个函数。在编译的时候,CPP编译器会将参数类型和函数名连接在一起,于是在程序编译成为目标文件以后,CPP编译器可以直接根据目标文件中的符号名将多个目标文件连接成一个目标文件或者可执行文件。但是在C语言中,由于完全没有多态性的概念,C编译器在编译时除了会在函数名前面添加一个下划线之外,什么也不会做(至少很多编译器都是这样干的)。
举例如下:
testExtern.h
#ifndef _TEST_EXTERN_H_
#define _TEST_EXTERN_H_
//声明变量
extern int iCount ;
//声明方法
void printCount();
#endif // !_test_Extern_H_
testExtern1.c
#include "testExtern.h"
//定义变量
int iCount = 1;
//定义方法
void printCount(){
iCount++;
printf("iCount=%d\n", iCount);
}
testMain.cpp
#include "testExtern.h"
int main(){
iCount = 10;
printCount();
while (1)
{
}
}
以上代码编译出错,找不到printCount方法。错误原因就是c++在编译器编译c的代码的时候,会对名字重新命名,导致链接的时候找不到该方法。
解决办法1:修改testExtern.h头文件
#ifndef _TEST_EXTERN_H_
#define _TEST_EXTERN_H_
#ifdef __cplusplus
extern "C"{
#endif
//声明变量
extern int iCount ;
//声明方法
void printCount();
#ifdef __cplusplus
}
#endif
#endif // !_test_Extern_H_
解决办法2:修改testMain.cpp中引用头文件的时候指出引用的是.c的头文件
extern "C" {
#include "testExtern.h"
}
int main(){
iCount = 10;
printCount();
while (1)
{
}
}
希望对您有所帮助!