extern置于一个变量或函数前,也可用来进行链接指定。下面是几种使用情况:
(1)在一个源文件中定义:char a[6]; (定义一个字符数组)
另一个文件中声明:extern char *a;(声明一个指针变量)
注意:第二个是非法访问,指向类型T的指针并不等价于类型T的数组,所以改为extern char a[];
(2) 对于变量:定义只能出现在一处,声明可出现很多次。
如:extren int a;声明一个全局变量a。
int a;定义a
extren int a=0;声明并给初值
int a=0;定义并给初值
(3)用于变量声明的一个作用
在*.c文件中声明了一个全局变量,此变量如被引用,就在*.h文件并用extern声明。
(4)现代编译器采用文件编译方式
编译时,各文件中定义的全局变量相互透明;
链接时,将各文件内容“合为一体”,全局变量名不可以相同,否则会报错,变量可见范围扩大到整个程序。
用extren告诉编译器,标识符在别的文件中定义。
(5)用于函数前面
可用来取代 include “*.h" 来声明函数,但为了避免错误,还是用include好些。
(6)extern int a;这个只是声明,不会分配内存空间的。
C中不支持extren “C”。
C++中调用一个C语言编写的.DLL时,当包含.DLL的头文件或声明接口函数时,应加extren “C” {}。
C++中引用C中函数或变量时,C++头文件中需加extren “C”。
但是中不可直接引用声明了extern “C”的头文件,应该仅仅将C文件中C++中定义的extern “C”函数声明为
extern类型,也就是说将C++中需要定义为extern类型的函数,单独extern。
例://C++头文件 example.h
#ifndef EXAMPLE_H
#define EXAMPLE_H
extern "C" int add(int x,int,y);
#endif
//C++源文件 example.cpp
int add (int x,int ,y)
{
return x+y;
}
//C实现文件 cFile.c
//会编译出错 #include "example.h"
extern int add(intx,int y);
int main(int argc,char *argv[])
{
add(2,3);
return 0;
}