C++ extern 关键字

一、extern 关键字

关键字 extern 可以应用于全局变量、函数或模板声明,它指定符号具有 external 链接。extern关键字的作用就是告诉编译器,它修饰的变量或者函数在别处定义。下面是extern常见的使用场景

1.1、在a.cpp文件中使用在b.cpp中定义的函数或全局变量

对于“在a.cpp文件中使用在b.cpp中定义的函数”这种场景,大家应该非常熟悉。一般会通过在a.cpp中#include "b.h"来解决这个问题。在某些情况下,可能b.cpp文件并没有对应的b.h头文件,这时就需要在a.cpp中使用extern关键字声明b.cpp中的函数。如下:

// Utils.cpp
int g_num = 20;
void display(int a) {
    cout << "a = " << a << endl;
}

// main.cpp
#include <iostream>
using namespace std;

extern void display(int);    // 声明Utils.cpp中定义的display函数
extern int g_num;    // 声明Utils.cpp中定义的全局变量g_num

int main() {
    display(10);
    cout << "g_num = " << g_num;
    return 0;
}

1.2、extern 全局 const 链接

默认情况下,const 全局变量具有内部链接。 如果希望变量具有 external 链接,请将 extern 关键字应用于const全局变量定义以及其它文件中所有的引用声明,如下:

//fileA.cpp
extern const int i = 42; // extern const definition

//fileB.cpp
extern const int i;  // declaration only. same as i in FileA

1.3、C 调用 C++

extern “C” 修饰的函数,通过C++ 编译器,不会对它进行函数名处理,也就是保持原来的函数名。如下:

// cppExample.h
#ifndef __CPP_EXAMPLE_H__
#define __CPP_EXAMPLE_H__

#ifdef __cplusplus
extern "C" int add(int x, int y);
#endif

#endif

// cppExample.cpp
#include "cppExample.h"
int add(int x, int y)
{
    return x + y;
}

// cFile.c
#include <stdio.h>
#include "cppExample.h"

int main(int argc, char **argv)
{
    printf("%d\n", add(10, 20));
    return 0;
}

一般情况下C++提供的头文件,都使用下面的格式

#ifndef __TEST
#define __TEST
#ifdef __cplusplus
extern "C" {
#endif
 
//函数声明
 
#ifdef __cplusplus
}
#endif
#endif /* __TEST */

1.4、C++ 调用 C

C++引用C代码时,引用C头文件的语句需被extern包括。如果不加则会导致编译错误,找不到符号定义,如下:

// cExample.h
extern int add(int x, int y);

// cExample.c
#include "cExample.h"
int add(int x, int y)
{
    return x + y;
}

// cppFile.cpp
#include <iostream>
using namespace std;

extern "C"{
#include "cExample.h"
}

int main(int argc, char **argv)
{
    cout << add(2, 3) << endl;
    return 0;
}

1.5、C++支持函数重载,C不支持函数重载

C++支持函数重载,而C则不支持。函数被C++编译器编译后在符号表中的名字与C语言的不同。例如,假设某个函数的原型为:

void foo(int a, int b);

该函数被C编译器编译后在符号表中的名字为_foo,而C++编译器则会产生像_foo_int_int之类的名字。_foo_int_int这样的名字包含了函数名和函数的特征标,C++就是使用这种机制来实现函数重载的。为了实现C和C++的混合编程,C++提供了C连接交换指定符号extern "C"来解决名字匹配问题,函数声明前加上extern "C"后,则编译器就会按照C语言的方式将该函数编译为_foo,这样C语言中就可以调用C++的函数了。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值