C++关键字-extern
变量的定义和声明
声明:用于向程序表明变量的类型和名字。
定义:指申请存储空间,并将其与变量名相关联,除此之外,还可以为变量指定初始值。
变量可以声明多次,但只能定义一次。
一般而言,定义变量的时候,同时也声明了变量,但通过extern关键字可以只声明但不定义变量。
extern声明告诉编译器这个变量定义在程序的其他地方。
// fileA.cpp
int i;
int j = 1;
// 如果外部文件要使用const常量,定义时必须加extern
extern const int k = 1;
double max(double d1,double d2){ }
// fileB.cpp
extern int i;
extern int j;
// 虽然声明k不加const可以通过编译,但是运行时会报错
extern const int k;
extern double max(double d1,double d2);
// 错误, 重复定义
extern int j = 2;
extern的用法
关键字 extern 具有四种含义,具体取决于上下文:
- 在非const全局变量声明中,extern指定变量或函数在另一个文件中定义。 必须在除定义变量的文件之外的所有文件中应用 extern。
//fileA.cpp
int i = 42; // declaration and definition
//fileB.cpp
extern int i; // declaration only.
//fileC.cpp
extern int i; // declaration only.
- 在const变量声明中,它指定变量具有外部链接。 extern必须应用于所有文件中的所有声明。 (非const变量默认为extern,要使const变量能够在其他文件中访问,必须在文件中显式地指定它为extern)
//fileA.cpp
extern const int i = 42; // extern const definition
//fileB.cpp
extern const int i; // declaration only.
- extern “C”指定函数在别处定义并使用C语言调用约定。 extern “C”修饰符也可以应用于块中的多个函数声明。
extern "C" int errno;
extern "C" int printf(const char *fmt, ...);
extern "C" {
#include <stdio.h>
}
extern "C" {
char ShowChar(char ch);
char GetChar(void);
}
extern "C" char ShowChar(char ch) {
putchar(ch);
return ch;
}
// fileA.hpp
#ifdef __cplusplus
extern "C" {
#endif
/**** some declaration or so *****/
#ifdef __cplusplus
}
#endif
- 在模板声明中,extern 指定模板已在其他位置实例化。 extern 告知编译器它可以重复使用另一个实例化,而不是在当前位置创建新实例。