? extern关键字的作用
- 用在源文件中,表示变量或函数对外开放,可以被其它文件使用
- 用在头文件中,对外声明变量或函数是extern的
- 用于源文件的文件引用,表示引用的变量或函数来自其它文件,可以取代include使用
- static与extern意义正好相反,表示变量或函数不能被其它文件使用,注意这里的static用于文件而不是类,不要和静态成员函数弄混淆
- 用于不同语言之间混编,extern C一起连用,提示编译器函数应当使用C语言规则编译
? 默认的extern和static属性
- 变量和函数默认是extern的,常量默认是static的,和默认属性一直可以省略关键字
- 不同的C++编译器,规则可能有所偏差,而且大多C++编译器都没有没有完善的编译检查,可能在源文件将变量定义为extern,然后在头文件中将变量定义为static,也是被允许的,然后在运行时出现未知异常
- 尽量不要去挑战编译器规则,故意编写奇葩但是编译器没法检测的代码,这样做没什么实际意义。按标准C++规则来,一般程序都不会有问题,编译器一般只会遗漏安全检查,代码冲突方面的工作,不会让标准的C++代码以异常方式工作
? C和C++的函数编译规则
C++由于存在函数重载,所以编译时必须对函数名进行处理,才能区分多个重载函数 void foo() => _foo void foo(int x, int y) => _foo_int_int 当foo(int x, int y)被外部文件引用时,编译器就从目标文件中寻找名为_foo_int_int的函数
而C语言不存在函数重载的情况,所以直接以源文件中的函数名作为字节码中的函数名 void foo(int x, int y) => _foo 当foo(int x, int y)被外部文件引用时,编译器会从目标文件中寻找名为_foo的函数
由于C和C++的函数编译规则不一样,当项目中既有C文件,又有C++文件时,我们就必须手动告诉编译器,引用的外部方法是使用哪个规则编译的,这样编译器才能从目标文件中找到正确的对应函数
? C++引用外部文件
//module.cpp
extern int abc = 200;
//module.h
extern int abc;
//main.cpp
#include
#include "module.h"
int main() {
std::cout
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?