你C语言的无参函数声明写对了吗?

    笔者最近在复习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()函数并不需要参数,那么程序到底能不能运行呢?我们来试一下:

131324_JEFY_2654590.png

130857_wSk9_2654590.png

    从上图我们可以知道,代码0错误,0警告,程序正常运行了,编译器并没有发现函数参数不匹配的错误!

    或许有人看了会说这个函数原本就不需要参数,即使现在传递了参数也不影响程序的正确性啊。但这终究是不规范的写法,我们应该抱着严谨的态度去写代码,养成良好的编程习惯很重要

    希望笔者的这篇文章能对大家有所帮助。



参考文献:《C Primer Plus》(第五版)



转载于:https://my.oschina.net/feasible/blog/628396

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值