您当前的位置: 首页 >  c++

命运之手

暂无认证

  • 2浏览

    0关注

    747博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

【零基础学QT】【019】C++中的extern关键字

命运之手 发布时间:2019-10-05 22:04:46 ,浏览量:2

? 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             
关注
打赏
1654938663
查看更多评论
0.0739s