从extern说开去(一)


extern符号的主要目的是为了实现C++对C程序的正确调用,在C++中完美兼容C。

包含的含义主要有两个方面:

(1)extern关键字表明函数和全局变量的作用范围。从链接的角度看,意味着在编译期间会以约定的方式表示引用的在其他模块中声明的函数或变量,等到链接时再重定位,进行地址修正(绝对地址修正和相对地址修正)。与之相对应的是static,用static声明后的函数和变量无法被其他模块引用。

(2)遇到由extern声明的部分,C++编译器会以C的方式进行编译。

逐条来看具体含义。

首先要搞清楚,我们通常所说的编译并不准确。从源代码到可执行文件,要经历4个主要步骤预编译 -> 编译 -> 汇编 -> 链接。

与extern相关的主要在链接和编译的过程,所以主要讲解这两个过程。

首先看看链接(因为相对简单)。

链接的本质是把多个不同的目标文件互相粘合在一起。编译器编译源代码后生成的文件叫做目标文件,从广义上看目标文件与可执行文件的结构是一致的,区别在于由于没有经过链接的过程,引用的不是在本模块内定义的函数和全局变量只能以约定的方式表示,并不能获得实际的内容。以hello world程序举例

#include<stdio.h>

int main()
{
    printf("hello world!\n");
    return 0;
}
上述代码中,调用了printf函数。函数名就是一个指针,指向代表函数代码片段的入口地址。而函数的代码片段在哪呢?或者说函数名这个指针指向哪里呢?答案就是函数定义的模块。也就是说,对于一个完整的可执行文件,printf指向这个函数代码片段的位置,也就是指向定义这个函数的模块的某一个位置。而在链接之前,编译的过程中这个值会以约定的方式代替,链接的作用就是将具体的地址填入。

搞清了链接的作用,我们就可以知道,对于一个目标文件,它所用的符号(函数和变量统称为符号),如果是在它内部定义的(也就是在源代码中定义),它可以直接获取到这个符号的地址,即时不链接也可以直接用。而对于在其他文件内定义的符号(它所引用的,比如printf),只有在链接之后才能获得具体地址。

既然有可以被其他模块引用的符号(链接之后获得地址的符号),那么自然也就有不可以被其他模块所引用的符号(static声明)。

这就是extern的第一个含义。

1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 、4下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合;、下载 4使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合;、 4下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.m或d论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 、1资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值