笔者最近在复习C语言函数时遇到了一个自己在写函数声明时时常会犯的一个错误,所以现在想把它写出来跟大家分享一下。
笔者之前在写没有参数的函数的声明时,通常会将void省略,如下:
void showMessage(); //不规范的写法
在笔者的潜意识里,这种写法和下面的写法是一样的,但实际上是不一样的,而且差别很大。那么,它们之间的差别在哪呢,这就是笔者接下来要讨论的问题。
void showMessage(void);//规范的写法
想必大家都知道ANSI C (不知道的可以自行度娘),在ANSI C中,需要使用函数原型(function prototype)来声明函数的返回值类型、参数个数以及各个参数的类型。而在ANSI C之前,函数声明并不涉及函数参数,只需要声明函数的返回值类型即可。所以现在摆在大家面前的有两种函数声明方式:
1、符合ANSI C标准的函数声明方式;
2、老式的函数声明方式。
对于上文中笔者省略void关键字的函数声明,ANSI C编译器会将其认定为老式的函数声明方式,即没用用函数原型声明函数,所以编译器在编译的时候不会进行参数检查,将发现不了函数调用时传递的参数与函数定义的参数不匹配的错误。
为了说明这点,笔者写了如下代码进行验证:
#include<stdio.h>
void showMessage();
int main(void)
{
showMessage("HelloWorld!",3.14);
return 0;
}
void showMessage()
{
printf("I am running now!\n");
return;
}
从代码中我们可以看到,笔者在调用showMessage()函数时向其传递了两个参数,但实际上showMessage()函数并不需要参数,那么程序到底能不能运行呢?我们来试一下:
从上图我们可以知道,代码0错误,0警告,程序正常运行了,编译器并没有发现函数参数不匹配的错误!
或许有人看了会说这个函数原本就不需要参数,即使现在传递了参数也不影响程序的正确性啊。但这终究是不规范的写法,我们应该抱着严谨的态度去写代码,养成良好的编程习惯很重要!
希望笔者的这篇文章能对大家有所帮助。
参考文献:《C Primer Plus》(第五版)