如何编写网站建设,养殖企业网站模板,wordpress数据库优化2018,网络营销策划方案15篇要求前言 #xff08;1#xff09;如果有嵌入式企业需要招聘湖南区域日常实习生#xff0c;任何区域的暑假Linux驱动实习岗位#xff0c;可C站直接私聊#xff0c;或者邮件#xff1a;zhangyixu02gmail.com#xff0c;此消息至2025年1月1日前均有效 #xff08;2#xff0…前言 1如果有嵌入式企业需要招聘湖南区域日常实习生任何区域的暑假Linux驱动实习岗位可C站直接私聊或者邮件zhangyixu02gmail.com此消息至2025年1月1日前均有效 2今天在交流群看到一个有意思的问题在此分享出来。 3注意本文需要一定的汇编基础和gcc编译流程基础。 问题 1群友问下面这个代码为啥能够编译通过在diag_application.c中调用WriteDid_Port()函数只传递了3个参数。但是在diag_did.c文件中定义WriteDid_Port()函数的时候需要传递4个参数啊。 2这里需要注意一点diag_application.c文件中没有包含diag_did.h文件。 分析
为什么能够编译通过 1首先有同学肯定会问了diag_application.c文件中没有包含diag_did.h文件这么明显的错误怎么会编译通过呢 2这个很好理解如果diag_did.h文件里面只有extern的函数声明那么你没有包含diag_did.h文件只会报警告而不是报错误。所以是可以编译通过的。 3同时这里很可能是写脚本的同事设置了无视所有警告的编译选项因此最终编译结果是0报错0警告的完美状态。 4如果没有设置无视警告的编译选项一定会报隐式声明的警告。隐式声明作为C语言的一个大坑一定要注意。 1在C标准中所有函数都是全局可见的。如果没有extern所有文件也都可以访问此函数。但是为什么需要extern其实是为了传参的时候知道应该传递什么参数函数会返回什么参数如果没有extern编译器会做隐式申明。有没有extern生成的汇编会略有不同不同点就是进入函数压栈的时候需要存几个退出的时候是否需要返回数据。但是都是会申明此函数来自外部。 2因为这里的函数并没有static特性所以说外部可以访问。那么在链接阶段就会将这两个.o文件中的WriteDid_Port()函数链接在一起。 3而汇编不一样汇编代码自带static特性没有.global 指令外部永远不可见。 这样做有什么隐患 1我们不清楚隐式声明最终声明成什么样子这里编译器很可能会根据你怎么写的就怎样隐式什么这样会导致运行时候最后传参是未知值跑的时候出现莫名其妙的问题。 参考 1万恶之源C语言中的隐式函数声明 2Linux-GCC介绍入门级Makefile使用