(1)在一个文件内声明外部变量。 如果外部变量不在文件开头定义,其有效的作用范围只限于定义处到文件终了。如果在定义之前的函数想引用该外部变量,在应该在引用之前用关键字extern对该变量作“外部变量声明”。
#include
<
iostream
>
using namespace std;
int main( int argc; char * argv[])
... {
extern a;
cout << a << endl;
}
int a = 5 ;
using namespace std;
int main( int argc; char * argv[])
... {
extern a;
cout << a << endl;
}
int a = 5 ;
(2) 在多文件的程序中声明外部变量。例如:1.cpp 2.cpp 在一个工程里面,编译的时候是一起编译的。
//
1.cpp
#include < iostream >
using namespace std;
int main( int argc, char * argv[])
... {
extern c;
cout << c << endl;
return 0;
}
#include < iostream >
using namespace std;
int main( int argc, char * argv[])
... {
extern c;
cout << c << endl;
return 0;
}
//
2.cpp
#ifndef __FILE_2CPP_
#define __FILE_2CPP_
#define __FILE_2CPP_
int c = 1;
#endif
#endif
如果按照下面的写法,就不需了extern了。
//
1.cpp
#include < iostream >
#include < iostream >
#include "1.h"
using namespace std;
int main( int argc, char * argv[])
... {
cout << c << endl;
return 0;
}
using namespace std;
int main( int argc, char * argv[])
... {
cout << c << endl;
return 0;
}
//
1.h
#ifndef __FILE_1HHH
#define
__FILE_1HHH
int c = 1;
#endif
#endif
(3)extern “C”
在C++环境下使用C函数的时候,常常会出现编译器无法找到obj模块中的C函数定义,从而导致链接失败的情况,应该如何解决这种情况呢?
答案与分析:
C++语言在编译的时候为了解决函数的多态问题,会将函数名和参数联合起来生成一个中间的函数名称,而C语言则不会,因此会造成链接时找不到对应函数的情况,此时C函数就需要用extern “C”进行链接指定,这告诉编译器,请保持我的名称,不要给我生成用于链接的中间函数名。
下面是一个标准的写法:
//
在.h文件的头上
#ifdef __cplusplus
#if __cplusplus
extern " C " ... {
#endif
#endif /* __cplusplus */
…
…
//.h文件结束的地方
#ifdef __cplusplus
#if __cplusplus
}
#endif
#endif /* __cplusplus */
#ifdef __cplusplus
#if __cplusplus
extern " C " ... {
#endif
#endif /* __cplusplus */
…
…
//.h文件结束的地方
#ifdef __cplusplus
#if __cplusplus
}
#endif
#endif /* __cplusplus */