| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 5032 人关注过本帖
标题:关于函数原型的意义问题
只看楼主 加入收藏
davidguhao
Rank: 1
来 自:广东
等 级:新手上路
帖 子:126
专家分:7
注 册:2016-7-18
结帖率:89.47%
收藏
 问题点数:0 回复次数:9 
关于函数原型的意义问题
我在学习的过程中发现,将函数原型删去,并且直接在原来的位置上使用函数定义,对程序本身的使用是没有任何影响的。那么……函数原型究竟用来干啥?


ps:我的教程书上称int an(int n);这样的东西为函数原型
搜索更多相关主题的帖子: 影响 
2016-07-22 13:00
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10609
专家分:43210
注 册:2014-5-20
收藏
得分:0 
声明函数,int an(int); 这样也可以。
2016-07-22 14:01
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9031
专家分:54061
注 册:2011-1-18
收藏
得分:0 
将函数原型删去,并且直接在原来的位置上使用函数定义,对程序本身的使用是没有任何影响的。
第一
在远古洪荒的过去,一个函数不声明,则编译器假定其为『返回类型为int,参数类型为可接受任何类型的函数,即 int foo(...) 』
但那毕竟是远古的事了,C标准早就禁止掉这个特性了。因此,如果你用的编译器不那么离谱,最起码会给一条警告信息。

第二
你只能说你测试的那几个例子没有问题
程序代码:
#include <stdio.h>

int main( void )
{
    foo( 1.23f );
    void foo( float n );
    foo( 1.23f );
}

void foo( float n )
{
    printf( "%f\n", n );
}
一种可能的输出是
584860314976236483507101602781593600.000000
1.230000
2016-07-22 14:58
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9031
专家分:54061
注 册:2011-1-18
收藏
得分:0 
算了,收回3楼的话,因为我发现我听不懂楼主说的话
在原来的位置上使用函数定义
“在原来的位置上调用函数”我懂,“在原来的位置上定义函数”我也懂,合起来就不懂了。

所以或许楼主其实问的是
int foo( void );
int main( void ) { foo(); }
int foo( void ) { return 0; }

int foo( void ) { return 0; }
int main( void ) { foo(); }
的差别
2016-07-22 15:21
wanglianyi1
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:14
帖 子:647
专家分:2067
注 册:2015-6-18
收藏
得分:0 
1、你说的函数原型就是函数的声明,作用就是告诉编译器你这个函数是什么类型的,有多少参数(当然参数名可以省略),C语言编译系统是由上往下编译的.一般被调函数放在主调函数后面的话,前面就该有声明.不然C由上往下的编译系统将无法识别。正如变量必须先声明后使用一样,函数也必须在被调用之前先声明,否则无法调用!函数的声明可以与定义分离,要注意的是一个函数只能被定义一次,但可以声明多次。
2、你说的把函数原型删掉,在原位置直接函数定义(确定函数的功能),这个当然没有问题
综上就是如果你的自定义函数要想在main函数或者其他函数中正确调用,就两个方法:一、在调用函数前面声明被调函数(也就是你说的函数原型),然后在调用函数后面定义被调函数;二、直接把被调函数定义到调用函数前;两种方法作用一样
2016-07-22 15:53
zx315
Rank: 5Rank: 5
来 自:广东
等 级:职业侠客
威 望:2
帖 子:86
专家分:378
注 册:2016-7-13
收藏
得分:0 
当两个函数互相调用的时候,你就会知道函数原型的作用了,比如

程序代码:
void fun1(int a) {
    if (a > 0) {
        fun2(a);
    }
    else {
        return;
    }
}

void fun2(int a) {
    if (a < 0) {
        fun1(a);
    }
    else {
        return;
    }
}


===

可参考《C语言程序设计—现代方法》第148页

图片附件: 游客没有浏览图片的权限,请 登录注册
收到的鲜花
  • davidguhao2016-07-23 14:44 送鲜花  3朵   附言:完美地解决了我的问题

Read The Fucking Source Code~
2016-07-23 10:06
davidguhao
Rank: 1
来 自:广东
等 级:新手上路
帖 子:126
专家分:7
注 册:2016-7-18
收藏
得分:0 
回复 6楼 zx315
总结了下……保证编译器在调用函数时的不会说哪个函数未定义对吧?

暨南大学市场营销……
但是我有一颗计算机专业的心……
2016-07-23 14:40
davidguhao
Rank: 1
来 自:广东
等 级:新手上路
帖 子:126
专家分:7
注 册:2016-7-18
收藏
得分:0 
回复 4楼 rjsp
对没错我就是这个意思……

暨南大学市场营销……
但是我有一颗计算机专业的心……
2016-07-23 14:41
zx315
Rank: 5Rank: 5
来 自:广东
等 级:职业侠客
威 望:2
帖 子:86
专家分:378
注 册:2016-7-13
收藏
得分:0 
回复 7楼 davidguhao
我理解的是,函数原型的作用在于让编译器能够在编译期间就能发现错误。

在 C99 之前,并没有函数原型这东东,如果某个函数的定义在调用点之后,那么 C 编译器会对函数的返回类型和形参类型做一些假设,所以有可能会因为参数类型的问题导致程序的崩溃,一种解决方案是将函数定义放在函数调用之前,但这样会发生前面说的两个函数互相调用的问题,而函数声明则是一种很好的解决方案。

从我们编写程序的角度来说,应该就是你说的这样理解吧~


Read The Fucking Source Code~
2016-07-23 18:54
书生牛犊
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:星夜征程
等 级:贵宾
威 望:10
帖 子:1101
专家分:5265
注 册:2015-10-27
收藏
得分:0 
1.C语言编译是从上往下的,所以所用你要用到的函数都应该在你准备用的位置之前,对于函数间互相调用的情况,我们就做不到让每一个都在另一个的前面了。
2.main函数通常是每一个程序都有的,它是整个程序的核心,对于程序员来说,要解读一个代码通常是从main函数出发模拟运行的。把main函数放到最后面,好找吗?不好找(page down能到文末但不能定位到main函数的开始)
3.写程序因为要考虑到未来的维护、扩展等因素,一般都很讲究耦合、聚合。所以比较大众化的做法是把一个程序分成多个功能模块分别编写。留在main里的语句一般也都不多,你可以看到在隔壁的一位小伙伴贴的“俄罗斯方块”代码main函数就三行。你要写的函数很多,那么每一个函数都会占据若干行吧。这种情况下函数定义的作用就是列了一个清单,告诉“看官”,我的程序有几个什么函数,由每个函数的命名就应该让“看官”知道那一段代码的作用可能是什么,然后结合后面的main函数,“看官”就能基本了解你这个程序是怎么样的流程。

我个人认为,函数定义最重要的作用应该是第三点,让人(这个人也包括你自己,通常情况下,要维护你代码的人会是你自己,而由于时间关系,你根本就不记得这些代码各个部分的作用了)看清楚你代码的思路。

φ(゜▽゜*)♪
2016-07-23 19:35
快速回复:关于函数原型的意义问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.106274 second(s), 10 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved