C++ extern关键字
extern是一个关键字,它告诉编译器存在着一个变量或者一个函数,如果在当前编译语句的前面中没有找到相应的变量或者函数,也会在当前文件的后面或者其它文件中定义,来看下面的例子
// extern.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <iostream>
using namespace std;
extern int i;
extern void func();
int _tmain(int argc, _TCHAR* argv[])//typedef wchar_t _TCHAR;#define _tmain wmain
{
i = 0;
func();
return 0;
}
int i;
void func()
{
i++;
cout << "i = " << i << endl;
}
上面代码中变量i和函数func在文件末尾定义,所以变量需要使用extern关键字告诉编译器,变量在别的地方定义
在一个文件中定义了变量和函数, 在其他文件中要使用它们, 可以有两种方式:
- 使用头文件,然后声明它们,然后其他文件去包含头文件
- 在其他.cpp或者.c文件定义和声明,直接用extern关键字调用
第一个很常见,看第二个
devVar.cpp函数中定义
#include "stdafx.h"
int i;
extern.cpp中
// extern.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <iostream>
using namespace std;
extern int i;
extern void func();
int _tmain(int argc, _TCHAR* argv[])//typedef wchar_t _TCHAR;#define _tmain wmain
{
i = 0;
func();
return 0;
}
void func()
{
i++;
cout << "i = " << i << endl;
}
编译工程,程序输出i = 1
,这里使用extern关键字声明在其它cpp文件中定义的变量和函数
extern"C" 作用
C++语言在编译的时候为了解决函数的多态问题,会将函数名和参数联合起来生成一个中间的函数名称,而C语言则不会,因此会造成链接时无法找到对应函数的情况,此时C函数就需要用extern “C”进行链接指定,这告诉编译器,请保持我的名称,不要给我生成用于链接的中间函数名
比如说你用C 开发了一个DLL 库,为了能够让C ++语言也能够调用你的DLL 输出(Export) 的函数,你需要用extern “C” 来强制编译器不要修改你的函数名
声明和定义知识点
- 定义也是声明,extern声明不是定义,即不分配存储空间
extern告诉编译器变量在其他地方定义了
extern int i; //声明,不是定义
int i; //声明,也是定义
- 如果声明有初始化式,就被当作定义,即使前面加了extern
只有当extern声明位于函数外部时,才可以被初始化
extern double pi=3.1416; //定义
- 函数的声明和定义区别比较简单,带有{}的就是定义,否则就是声明
extern double max(double d1,double d2); //声明
double max(double d1,double d2){} //定义
- 除非有extern关键字,否则都是变量的定义
extern int i; //声明
int i; //定义
程序设计风格:
- 不要把变量定义放入.h文件,这样容易导致重复定义错误
- 尽量使用static关键字把变量定义限制于该源文件作用域,除非变量被设计成全局的
- 也就是说可以在头文件中声明一个变量,在用的时候包含这个头文件就声明了这个变量