1 extern基本理解
extern在本文件的头文件声明,声明时可以不赋初值,在其他文件赋初值并使用。
或者在本文件的头文件extern声明,在本cpp文件中赋初值,在其他文件使用。
注其他文件需要include这个头文件。
2 extern有关的定义和声明的区别
首先理解声明和定义的区别:
可以声明多次,只能定义一次。定义才分配存储空间
extern int i; //声明一个变量i,但是并没有定义
int a;//定义变量a
extern int i; //声明一个变量i,但是并没有定义
int a = 1;//定义变量a并赋值
extern int i = 1; //声明一个变量i,并定义
int a; //重复定义,会报错
3 使用外部文件的接口
/****max.c****/
#include <stdio.h>
/*外部变量声明,提供接口的函数*/
extern int g_X ;
extern int g_Y ;
int max()
{
return (g_X > g_Y ? g_X : g_Y);
}
/***main.c****/
#include <stdio.h>
/*定义两个全局变量,并使用接口*/
int g_X=10;
int g_Y=20;
int max();
int main(void)
{
int result;
result = max();
printf("the max value is %d\n",result);
return 0;
}
4 extern "c"的用法
(1)意图
extern "C"是C++特有的指令(C无法使用该指令),目的在于支持C++与C混合编程。
(2)作用
extern “C”的作用是告诉C++编译器用C规则编译指定的代码(除函数重载外,extern “C”不影响C++其他特性)。
(3)原因
为什么要用C规则编译C++代码呢?
因为C和C++的编译规则不一样,主要区别体现在编译期间生成函数符号的规则不一致。
C++比C出道晚,但是增加了很多优秀的功能,函数重载就是其中之一。由于C++需要支持重载,单纯的函数名无法区分出具体的函数,所以在编译阶段就需要将形参列表作为附加项增加到函数符号中。如以下代码
void Function(int a, int b)
{
printf("Hello!!! a = %d, b = %d\n", a, b);
}
C和C++对应的的汇编码如下
C汇编结果
Function:
.LFB11:
.cfi_startproc
movl %esi, %edx
xorl %eax, %eax
movl %edi, %esi
movl $.LC0, %edi
jmp printf
.cfi_endproc
C++汇编结果
_Z8Functionii:
.LFB12:
.cfi_startproc
movl %esi, %edx
xorl %eax, %eax
movl %edi, %esi
movl $.LC0, %edi
jmp printf
.cfi_endproc
容易发现,两段代码的区别仅在于函数 Function(int a, int b)
编译后对应的符号不同
C:Function
C++:_Z8Functionii
(4)使用方法
C与C++的相互调用
C++ 调 C
C++中调用的C语言包含在C语言头文件时,可如此调用:
extern "C" {#include "sample_c.h"}
完整例子如下:
//c语言头文件:sample_c.h
#ifndef SAMPLE_C_H
#define SAMPLE_C_H
extern int plus( int a, int b);
#endif
//c语言实现文件:sample_c.c
#include "sample_c.h"
int plus( int a, int b){
return a+b;
}
//c++文件:sample_cpp.cpp
extern "C"{
#include "sample_c.h"
}
int main( int argc, int **argv){
plus( 1, 1);
}
C 调 C++
C语言中不支持extern "C"声明,所以调用起C++来和C++调用C有点区别。
//C++头文件:sample_cpp.h
#ifndef SAMPLE_CPP_H
#define SAMPLE_CPP_H
extern "C" int plus( int a, int b);
#endif
//C++实现文件:sample_cpp.cpp
#include "sample_cpp.h"
int plus( int a, int b){
return a+b;
}
//C实现文件:sample_c.c
extern int plus( int a ,int b);//C语言中在此写#include "sample_cpp.h"会出错
int main(){
plus( 1, 1);
}
extern的参考链接
extern基础用法介绍:
http://c.biancheng.net/view/404.html
extern高级用法介绍:
https://www.cnblogs.com/WindSun/p/11434436.html
extern "c"的原理:
https://blog.csdn.net/sinat_36817189/article/details/110423243
extern "c"的使用:
https://www.cnblogs.com/sunhuahuaa/p/7562495.html