隐式函数声明会导致系统怎么样?

描述

前言

什么是C语言的隐式函数声明。

在C语言中,函数在调用前不一定非要声明被调用的函数。如果没有声明的话,那么编译器会自动按照一种隐式声明的规则,为调用函数的C代码产生汇编代码。

如何踩坑的?

首先说明的是,在一份优先的源代码中,编译时通常是不会出现关于函数隐式声明的警告。

因为有着严格的编程规范,防止出现这种情况

请看下面的代码样例,有什么问题吗?

#include 

int main(void)
{
    int val = sqrt(4);

    printf("sqrt = %d", val);
}

在使用函数sqrt时没有包含头文件,在通过 IDE 软件编译链接时,通常会给出隐式函数声明的警告,很多初学者一般不怎么在意,只会在乎编译是否报错,因为只要能编译通过,程序就能正常运行。

然而,忽略隐式函数声明的警告程序就一定能正常运行吗?

根据隐式函数声明规则,编译器在编译时如果碰到这种问题,会自动按照一种隐式声明的规则,为调用函数的C代码产生汇编代码,或者查找与隐式声明同名的函数。

如上述的代码示例中隐式声明的函数原型为:

int sqrt(int);

而对于的同名函数原型为:

double sqrt(double);

由于隐式函数声明,函数的返回值类型和参数类型均不一样,导致了错误的调用方式,在实际运行过程中极有可能出现错误。

特别是嵌入式软件开发,会接触很多系列的MCU平台,有着不一样的IDE软件可以开发,同样的代码,如果存在函数隐式声明的情况,在不同的IDE软件编译下,可能某一个编译下载后运行正常,而另一个IDE软件编译下载后却异常了,甚至出现跑飞的情况,那么一定要关注函数隐式声明的警告。


预防及解决措施

  • 首先可以从代码规范约束学起,调用某个模块的函数一定要包含对应的头文件,且头文件有该函数的声明。
  • 注意所有的警告,有些警告十分值得重视,尽量消除所有的警告
  • 在gcc编译时,可以增加编译选项-Werror=implicit-function-declaration将警告设置为错误
打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分