c/c++ 中extern 关键字
详细参考http://www.cnblogs.com/yc_sunniwell/archive/2010/07/14/1777431.html
基本解释:
extern可以置于变量或者函数前,以标示该变量或者函数定义在其他的文件中,提示编译器遇到此变量或者函数时去其他模块寻找定义;此外extern也可以用来进行链接指定。
extern 变量
在一个源文件中定义一个数组:char a[] = “1234”;
在另一个文件中使用下列声明: extern char* a;
请问,这样可以吗? 分析:不可以,
1. 指向类型T的指针并不等价于类型T的数组。extern char *eChar声明的是一个指针变量而不是char型数组,从而造成运行时
非法访问。extern 遵从严格的声明!
2. 在.cpp文件中声明一个全局的变量,这个全局变量要被引用,就放在.h文件中使用extern声明;
这样避免了在使用该全局变量的源文件中都必须使用extern对该变量声明,只需包含该头文件即可。
3. 把声明和定义放在一起可能存在的问题,如:extern int eInt = 2;这时候相当于没有extern,如果把该语句放在某个头文件中,当有多个源文件引用该头文件时,编译时会在每个模块中都定义了一个eInt变量,当连接多个文件时会报错。
#ifndef _A_H
#define _A_H
/*
在.cpp文件中声明一个全局的变量,这个全局变量要被引用,就放在.h文件中使用extern声明;
这样避免了在使用该全局变量的源文件中都必须使用extern对该变量声明,只需包含该头文件即可。
*/
extern int eInt ; //
// extern char *eChar; // a.cpp:4: error: conflicting declaration ‘char eChar []’
// a.h:11: error: ‘eChar’ has a previous declaration as ‘char* eChar’
/*
指向类型T的指针并不等价于类型T的数组。extern char *eChar声明的是一个指针变量而不是char型数组,从而造成运行时
非法访问。extern 遵从严格的声明!
*/
extern char eChar[];
#endif
//a.cpp
#include "a.h"
int eInt = 10;
char eChar[] = "123456";
//test.cpp
#include "a.h"
#include <iostream>
using namespace std;
// extern int eInt ;
int main(int argc, char const *argv[])
{
cout<<++eInt<<endl;
cout<<eChar<<endl;
cout<<*eChar<<endl;
return 0;
}
extern修饰函数
如果函数的声明中带有关键字extern,仅仅是暗示这个函数可能在别的源文件里定义,没有其它作用。即下述两个函数声明没有明显的区别:
extern int f(); 和int f();
当然,这样的用处还是有的,就是在程序中取代include “*.h”来声明函数。
实现C++与C的混合编程
被extern”C”修饰的变量和函数是按照C语言方式编译和连接的,未加extern “C”则按照声明时的编译方式。
//在C++中引用C语言中的函数和变量,在包含C语言头文件(假设为cExample.h)时,需进行下列处理:
extern "C"{
#include "cExample.h"
}
在C中引用C++ 语言中的函数和变量时,C++ 的头文件需添加extern”C”,但是在C语言中不能直接引用声明了extern”C”的该头文件,应该仅将C文件中将C++ 中定义的extern”C”函数声明为extern类型。注意 c++ 中的类、多态、重载等C中不支持!!