比如在一个test.h文件中有如下代码:
#include <iostream>
using namespace std;
int a = 1;
void printLog()
{
printf("this is a test");
}
如果想要在另外一个源文件中使用这些全局变量的话,需要首先用extern声明一下在本文件中使用的变量可以再其他模块中寻找到:
在main.c中这样写:
#include "main.h"
#include <iostream>
using namespace std;
extern int a;
extern void printLog();
int main(void)
{
printf("%d",a);
printLog();
system("pause");
return 0;
}
需要注意的是extern仅仅是声明而已,不是定义,一个变量只能够定义一次,但是却可以声明多次。
此外还有extern "C"的用法,比如:
extern "C" {
#include "lua.h"
#include "tolua++.h"
#include "lualib.h"
#include "lauxlib.h"
#include "tolua_fix.h"
#include "snapshot.h"
#include "xxtea.h"
}
extern "C" 包含双重含义,从字面上即可得到:首先,被它修饰的目标是“extern”的;其次,被它修饰的目标是“C”的。
第一种含义上面其实就是的,第二种含义就是:
被extern "C"修饰的变量和函数是按照C语言方式编译和连接的;
未加extern“C”声明时的编译方式。
首先看看C++中对类似C的函数是怎样编译的。
作为一种面向对象的语言,C++支持函数重载,而过程式语言C则不支持。函数被C++编译后在符号库中的名字与C语言的不同。例如,假设某个函数的原型为:void foo( int x, int y );
该函数被C编译器编译后在符号库中的名字为_foo,而C++编译器则会产生像_foo_int_int之类的名字(不同的编译器可能生成的名字不同,但是都采用了相同的机制,生成的新名字称为“mangled name”)。_foo_int_int这样的名字包含了函数名、函数参数数量及类型信息,C++就是靠这种机制来实现函数重载的。例如,在C++中,函数void foo( int x, int y )与void foo( int x, float y )编译生成的符号是不相同的,后者为_foo_int_float。