笔者最近在复习C语言函数时遇到了一个本身在写函数声明时时常会犯的一个错误,因此如今想把它写出来跟你们分享一下。编程
笔者以前在写没有参数的函数的声明时,一般会将void省略,以下:函数
void showMessage(); //不规范的写法
在笔者的潜意识里,这种写法和下面的写法是同样的,但其实是不同的,并且差异很大。那么,它们之间的差异在哪呢,这就是笔者接下来要讨论的问题。spa
void showMessage(void);//规范的写法
想必你们都知道ANSI C (不知道的能够自行度娘),在ANSI C中,须要使用函数原型(function prototype)来声明函数的返回值类型、参数个数以及各个参数的类型。而在ANSI C以前,函数声明并不涉及函数参数,只须要声明函数的返回值类型便可。因此如今摆在你们面前的有两种函数声明方式:prototype
一、符合ANSI C标准的函数声明方式;code
二、老式的函数声明方式。ci
对于上文中笔者省略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()函数并不须要参数,那么程序到底能不能运行呢?咱们来试一下:io
从上图咱们能够知道,代码0错误,0警告,程序正常运行了,编译器并无发现函数参数不匹配的错误!编译
或许有人看了会说这个函数本来就不须要参数,即便如今传递了参数也不影响程序的正确性啊。但这终究是不规范的写法,咱们应该抱着严谨的态度去写代码,养成良好的编程习惯很重要!
但愿笔者的这篇文章能对你们有所帮助。
参考文献:《C Primer Plus》(第五版)