当前位置:首页 > > 大橙子疯嵌入式


前言

什么是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将警告设置为错误



本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除( 邮箱:macysun@21ic.com )。
关闭