| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2360 人关注过本帖, 1 人收藏
标题:c的心脏——函数
只看楼主 加入收藏
jokerskill
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:392
专家分:554
注 册:2012-3-4
结帖率:73.08%
收藏(1)
已结贴  问题点数:100 回复次数:29 
c的心脏——函数
书上说过函数是c语言的灵魂和心脏c语言只支持一种风格的函数——即外部函数。
函数体内不能再定义函数
如:
int f(void) //错误
{
int f1(void)
{
......
}
}

声明函数的位置,
声明函数位置的不同,其作用范围也不同,这主要分为函数内部声明(也称为局部声明)和函数外部声明(如果放在最前端main()函数上又称为全局声明)两种情况
所谓函数内部声明,就是指将声明函数的语句放在一个函数体内,这种方式声明的函数仅可在内部
被调用。
下面的代码演示了内部声明函数的用法。
#include <stdio.h>

int main()  //主函数
{
void game_begin(void);  //在主函数内声明game_begin()函数
game_begin();           //调用game_begin()函数,由于它已经声明过,因此可以运行
game_end();             //调用game_end()函数,由于它未声明,因此将导致错误
return 0;
}
void game_begin(void) {     //game_begin()函数的定义代码
printf("游戏开始.\n祝你好运!\n");
}
void game_end(void) {     //game_end()函数的定义代码
printf("游戏结束.\n");
}
函数外部声明:
#include <stdio.h>
void game_begin(void);
void game_end(void);
int main()
{
game_begin();  //调用函数game_begin()
game_end();    //调用函数game_end()
return 0;
}
void game_begin(void) {     //game_begin()函数的定义代码
printf("游戏开始.\n祝你好运!\n");
}
void game_end(void) {     //game_end()函数的定义代码
printf("游戏结束.\n");
}
我想问外部声明函数和内部声明函数有什么不同呢???两者之间的调用范围是不是前者有限制,后者没有?
我还是不太懂,请大虾道露天机,谢谢各位了
搜索更多相关主题的帖子: 风格 include 声明 
2012-08-18 19:55
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:20 
早些天曾经说过的,复制到这里:
--------------------------

关于函数的原型声明,现代编程都建议放在的外部的,因为事实上放在函数内部逻辑难以自圆其说。

按语法,在花括号内部的东西,是局域性的。你在main()函数内部声明某个函数fun(),那么这个声明应该意味着fun()只能在main()内部使用,在main()外部是不可见的。但是这产生了如下问题:同样的语法也应该在非main()函数中成立,那么对main()下层的fun1()和fun2(),在fun1()中声明了fun(),照理fun2()应该不知道存在fun(),但是C的语法规定fun()函数的实现代码必须在函数外,也就是说它在文件模块中可见,这样fun2()事实上也能看到fun(),并非你预料的fun2()不能看见,这是自欺欺人。事实上,由于main()是最顶层的函数,一般在main()声明居于调用链的最顶层,由于main()的全局覆盖性质,它事实上等效于全局声明,此时是发现不了问题的,但如上所述那样考虑,就会出问题。

在文件级别上声明的函数,是在模块(该.c或.cpp文件是一个模块)中可见的,别的模块看不到(要看到必须用extern修饰符指定外部实现),这样,仍属于局域性的声明,是C能够模仿C++进行内部封装的基本手段——通常一个模块文件就相当于C++中的一个类,传统C都是这样使用模块做大系统的。

授人以渔,不授人以鱼。
2012-08-18 20:02
embed_xuel
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:58
帖 子:3845
专家分:11385
注 册:2011-9-13
收藏
得分:6 
我也记得前两天刚讨论过

总有那身价贱的人给作业贴回复完整的代码
2012-08-18 20:33
jokerskill
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:392
专家分:554
注 册:2012-3-4
收藏
得分:0 
由于main()的全局覆盖性质,它事实上等效于全局声明,  看懂了这句
2012-08-18 20:34
ly2222
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:217
专家分:618
注 册:2012-6-15
收藏
得分:4 
函数的作用就相当于一台机器,这种机器的作用各不相同。不同的函数能完成不同的特定的功能。就像你放玉米进去,它出来的是爆米花一样。它就对玉米进行处理了。而c语言的函数就是你放入数据,它就会对数据进行处理。

2012-08-18 20:34
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
你可以在非main()中声明一个函数,然后看看另外一个函数能不能调用这个似乎被包含在内部的函数。

授人以渔,不授人以鱼。
2012-08-18 20:42
jokerskill
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:392
专家分:554
注 册:2012-3-4
收藏
得分:0 
前两天我不在啊!!!
由于函数定义也可以作为函数原型使用——所以理解这句——由于main()的全局覆盖性质,它事实上等效于全局声明,
2012-08-18 20:43
jokerskill
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:392
专家分:554
注 册:2012-3-4
收藏
得分:0 
以下是引用TonyDeng在2012-8-18 20:42:28的发言:

你可以在非main()中声明一个函数,然后看看另外一个函数能不能调用这个似乎被包含在内部的函数。
大大可否写个验证代码
2012-08-18 20:47
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
模块级可见性,不等于全局性的。全局是对所有模块均可见,但模块可见只对所在的这个.c或.cpp文件可见,只要函数的组织得当,完全可以把一个模块当作C++的类来用,这是模块内封闭的。

授人以渔,不授人以鱼。
2012-08-18 20:48
embed_xuel
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:58
帖 子:3845
专家分:11385
注 册:2011-9-13
收藏
得分:0 
自己写个代码验证一下

总有那身价贱的人给作业贴回复完整的代码
2012-08-18 20:50
快速回复:c的心脏——函数
数据加载中...
 
   



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

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