extern的用法

对于变量而言,

extern int a,表明将要使用已经定义的一个全局变量a

int a,表明定义一个全局变量a

extern int a=0 ,表明定义并使用全局变量a;

加上extern关键字后可以防止不同程序文件中出现变量重定义的情况。


对于函数而言,

如果函数声明中带有关键字extern,那么仅说明这个函数可能在别的源文件中定义,这样就可以避免使用“.h”来找到某个函数,带有extern的函数,会在全局范围内查找该函数。
当原始定义函数的参数发生变化时,此时使用extern声明并不会报错,错误会在运行时发出。
extern"C"
当在C++环境下使用C函数的时候,常常会出现编译器无法找到obj模块中的C函数定义,从而导致连接失败的情况。C++语言在编译的时候为了解决函数的多态问题,会将函数名和参数联合在一起生成一个中间函数名,而C语言则不会,因此会造成连接时找不到对应函数的情况,此时C函数就需要extern ”C"进行连接指定,这告诉编译器,不要生成用于连接的中间函数名。(在说明C语言不支持类似于C++中通过参数类型区别的多态,c语言也不支持模板)

extern int a,仅仅是一个变量的声明,其并不是在定义变量a,并未为a分配内存空间。变量a在所有模块中作为一种全局变量只能被定义一次,否则会出现连接错误。
引用一个定义在其它模块的全局变量或函数(如,全局函数或变量定义在A模块,B欲引用)有两种方法,
一、B模块中include模块A的头文件;
二、模块B中对欲引用模块A的变量或函数重新声明一遍,并前加extern关键字。

与extern对应的关键字是static,被它修饰的全局变量和函数只能在本模块中使用。因此,一个函数或变量只可能被本模块使用时,其不可能被extern ”C"修饰。

extern"C"的习惯用法

(1)在C++中引用C语言中的函数和变量,在包含C语言头文件(假设为cExample.h)时,需进行如下处理:
extern "C"
{
#include "cExample.h"
}
而在C语言的头文件中,对其外部函数只能指定为extern类型,C语言中不支持extern“C"声明,在.c文件中包含了extern"C"时会出现编译语法错误。
如果C++调用一个C语言编写的.DLL时,当包括.DLL的头文件或声明接口函数时,应加extern“C"{}
(2)在C++引用C语言中的函数和变量时,C++的头文件需添加extern“C",但在C语言中不能直接引用声明了extern “C”的 该头文件,应该仅将C文件中在C++中定义的extern "C"函数声明为extern类型。

//C++头文件 cppExample.h
#ifndef CPP_EXAMPLE_H
#define CPP_EXAMPLE_H
extern "C" int add( int x, int y );
#endif
//C++实现文件 cppExample.cpp
#include "cppExample.h"
int add( int x, int y )
{
return x + y;
}
/* C实现文件 cFile.c
/* 这样会编译出错:#include "cppExample.h" */

1
2
3
4
5
6
extern  int  add ( int  x, int  y);
int  main ( int  argc, char *argv[])
{
   add(2,3);
   return  0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值