对于变量而言,
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;
}
|