文章目录
1. 声明与定义
一个c++程序可以包含多个文件,在一个文件中已定义的变量,如果要在另一个文件中调用,就要先声明一下变量,此时用extern这个关键字来声明
区分是定义还是声明关键在于看计算机是否为变量分配了存储空间
extern int a; //声明一个全局变量
int a; //定义一个全局变量
extern int a = 0; //定义全局变量并给初值
int a = 0; //定义全局变量并给初值
(注意:在一个程序中,变量只能被定义一次,但可以多次声明)
2. extern 变量
-
在其他文件中定义过的全局变量,在另一个文件中要调用时,只需在声明语句前加关键字extern
//文件1,定义变量 int i= 1; //文件2,声明变量 extern int i;
-
对于常量,要调用其他文件的常量时,做法如下:
//文件1,定义常量 extern const int i = 1; //文件2,声明常量 extern const int i;
3. extern 函数
- 函数也有声明和定义,但由于函数的声明和定义是有区别的,函数的定义是有函数体的,所以函数的声明和定义都可以将extern省略掉,反正其他文件也是知道这个函数是在其他地方定义的
- 故函数的声明extern关键字是可有可无的,因为函数本身不加修饰的话就是extern的
4. extern “C”
首先探讨一个问题:
4.1为什么c语言不支持函数重载
c语言编译器对函数名字修饰规则是下划线+函数名, 相同函数名的底层名称一样.
c++编译器修饰规则是一系列的字母: ?函数名@@YAHHH@Z, 其中三个H意思是返回值, 第一个参数类型, 第二个参数类型. 将参数的类型编译到最终函数的名字
例如: H是int, N是double
那为什么编译器对函数名的名字中有返回值得类型, 函数重载时却与返回值的类型无关?
1. 因为这种命名可能仅仅是VS的, 其他的编译器可能不是这样编译
2. 当进行函数调用时, 仅仅因为返回值不同无法确定是调用哪个函数
-
要想在cpp文件定义函数时使用c的命名方法, 函数定义前加 extern “C” int add(int left, int right)
-
extern “C”的真实目的:实现C++与C的混合编程
4.2 (应用1) 在.c文件使用.cpp的函数
-
C中引用C++语言中的函数或者变量时,C++的头文件需要加上extern “C”,但是C语言中不能直接引用声明了extern “C”的该头文件,应该仅在C中将C++中定义的extern “C”函数声明为extern类型。
C语言中不支持extern “C”,会报编译错误
/* c++头文件cppExample.h */
#ifndef CPP_EXAMPLE_H
#define CPP_EXAMPLE_H
extern "C" int add(int x, int y);
#endif
/* c实现文件cFile.c */
extern int add(int x, int y);
int main()
{
add(2, 3);
return 0;
}
4.3 (应用2) 在.cpp文件中使用.c的函数
在C++中引用C语言中的函数和变量,在包含C语言头文件时(假设为cExample.h),需进行以下处理:
extern “C”
{
#include “cExample.h”;
}
/* c语言头文件:cExample.h */
#ifndef C_EXAMPLE_H
#define C_EXAMPLE_H
extern int add(int x, int y);
#endif
/* c语言的实现文件:cExample.c */
#include "cExample.h"
int add(int x, int y)
{
return x + y;
}
/* c++实现文件,调用add:cppFile.cpp */
extern "C"
{
#include "cExample.h";
}
int main()
{
add(2, 3);
return 0;
}