目录
为什么要写这篇
如果你用的是Keil 、IAR、或者Eclipse 集成开发环境,很可能并不会出现报错但不提示错误原因的情况。如果遇到了报错但不提示错误原因,那可以接着往下看,可能会有所帮助。
我就遇上了编译报错但不提示原因的情况,真是花了好久才意识到问题原因。必须记录一下,要不然对不起我在此耽搁的时间。
函数被调用之前没有声明
为什么会报错? 关于函数,有三个概念:函数原型,提供函数接口; 函数调用,在程序中使用该函数,函数定义,函数的具体实现。 函数原型是一种声明形式,告知编译器在程序中要使用该函数。 函数原型还指明了函数的属性:函数的参数类型和返回值类型。如果事先未声明,C程序将无法通过编译。
函数被外部调用但函数用static修饰
没有函数原型不行吗?也不是不行,函数定义在函数调用之前,相当于已经声明,但如果过度依赖这种方式,而恰巧遇到编译器不提示错误类型,再加上程序进行一番改动后,即使明白这个知识点,但找起问题来也有种“摸不到头脑”的感觉,比较好的方式是将外部调用函数在头文件中声明,将内部函数在源文件顶部声明。 这里需要注意一点,关于内部函数用static修饰,可以用,但是要留意。比如我之前记录的一篇文章 记使用软件定时器的一次事故,软件定时器的回调函数被调用(调用并不明显),我用static 修饰了,结果又因为编译器的原因导致编译通过,但是实际运行出问题,也是花了好久才找到问题。
在switch case语句中定义变量
这问题也是遇到了好几次,后来了解到只要将变量声明 和 变量使用分开就可以了(准确来说是将变量声明放在函数头部),但不清楚具体是什么原因,后来遇到的次数多到足够引起我注意了,在网上搜了一下。
为什么会报错?举例来说,case1和case2在同一个作用域(本例中 作用域为该函数内部),case1 定义的变量,case2也可以使用,但如果没有执行case1,直接跳转到case2,case2就会调用一个并没有定义的变量,导致错误。和函数定义一样可以在调用之前定义,相当于已经声明。告知编译器将使用一个名称为XXX的变量,且该变量是YYY类型。
这个可以解决,限制变量的作用域,通过对case1语句部分加个{},表示是一个块,意思是一个复合语句,该变量只在这个复合语句内有效。如果几个case语句都调用的变量,就该定义在函数头部了。