分享更有价值
被信任是一种快乐

如何理解函数或全局变量重复定义

文章页正文上

这篇文章主要讲解了“如何理解函数或全局变量重复定义”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何理解函数或全局变量重复定义”吧!可能有些朋友第一反应是,那肯定是编译不过喽:编译:可以看到这里报错了,因为fun重复定义了。但是重复定义就会报错,会编译不过吗?不全是!再看下面的代码:输出结果:从结果中可以看到,虽然num被定义了两次,但是仍然可以编译通过,并且正常运行。这又是为什么呢?符号在说明今天重点分享的内容之前,先简单了解一下什么是符号。在《hello程序是如何变成可执行文件的》中讲到过,ELF文件生成的最后阶段会经历链接,而链接阶段正是基于符号才能完成。每个目标文件都会有一个符号表。而链接过程正是通过符号表中的符号,将不同的目标文件“粘”在一起,形成最后的库或者可执行文件。要查看一个目标文件的符号信息也很容易:编译:通过nm命令就可以查看符号信息,这里就有我们的func_symbol函数和全局变量symbol的符号。关于nm的使用,在《几个命令了解ELF文件的秘密》也有介绍。除了上面提到的全局符号,目标文件中还有其他符号信息,不过这不是本文关注的重免费云主机、域名点。强符号与弱符号对于C/C++语言来说,编译器默认函数和初始化了的全局变量为强符号,未初始化的全局变量为弱符号。当然也可以通过来定义一个强符号为弱符号。通过下面的例子来看看哪些是强符号,哪些是弱符号:注意,这里的强符号与弱符号都是针对定义来说的。同名时,用哪个?对于多重定义,即标题提到的变量重名时,链接器有它的处理规则:1.强符号不允许重复2.有一个强符号和多个弱符号,使用强符号3.多个弱符号,则随意选择一个关于第一点,在最开始的例子中你已经见到了,最常见的情况就是你重复定义了变量或者函数等等。而第二点也有示例,示例中,虽然定义了两个num,但是var.c中未初始化的num是弱符号,main.c中的num是强符号,这种情况下编译正常。只是最终会使用强符号的num。再看一个第三点的例子也是类似,当其中main.c的num无初始化时,也是可以编译过的。这种情况下的误用也就罢了,如果是重复的符号,但是类型不同,问题就更大了,即var.c的内容如下:这里的num变成了double,再次编译运行,你会发现意想不到的结果:为什么修改后是0?原因在于double类型的数据存储与int类型数据存储格式不一样,且它们占用空间长度都不一样,在本文例子中,double占用8字节,而int占用4字节。总之,这不是我们想要的结果,最终的后果可能比我们想象的要严重,要更难发现。感谢各位的阅读,以上就是“如何理解函数或全局变量重复定义”的内容了,经过本文的学习后,相信大家对如何理解函数或全局变量重复定义这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是云技术,小编将为大家推送更多相关知识点的文章,欢迎关注!

相关推荐: 如何用python实现自动刷抖音短视频

这篇文章主要介绍“如何用python实现自动刷抖音短视频”,在日常操作中,相信很多人在如何用python实现自动刷抖音短视频问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何用python实现自动刷抖音短视频”的疑惑有所帮助!接…

文章页内容下
赞(0) 打赏
版权声明:本站采用知识共享、学习交流,不允许用于商业用途;文章由发布者自行承担一切责任,与本站无关。
文章页正文下
文章页评论上

云服务器、web空间可免费试用

宝塔面板主机、支持php,mysql等,SSL部署;安全高速企业专供99.999%稳定,另有高防主机、不限制内容等类型,具体可咨询QQ:360163164,Tel同微信:18905205712

主机选购导航云服务器试用

登录

找回密码

注册