C++ extern

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

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注

Contents
滚动至顶部