| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2360 人关注过本帖, 1 人收藏
标题:c的心脏——函数
只看楼主 加入收藏
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
程序代码:
void fun1(void)
{
    void fun2(void);

    printf("fun1:");
    fun2();
}

void fun2(void)
{
    printf("Hello\n");
}

void main(void)
{
    printf("main:");
    fun2();
}

没上机,随手写的,自己测试一下。

授人以渔,不授人以鱼。
2012-08-18 20:52
pauljames
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:千里冰封
威 望:9
帖 子:1555
专家分:10000
注 册:2011-5-8
收藏
得分:15 
如果要封装某个内部函数,用static就可以了,这样外面的模块就不能调用了

经常不在线不能及时回复短消息,如有c/单片机/运动控制/数据采集等方面的项目难题可加qq1921826084。
2012-08-18 20:56
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
我记得最早学第一门语言Pascal的时候,是可以写函数内函数的,是真正的结构化语言。后来学C,没有这种功能,留下C有这种缺陷的印象。但很多年没碰Pascal,忘得差不多了,应该没记错吧。

C++和Java等完全面向对象的语言,都理所当然地支持内嵌类和函数之类的,因为这是面向对象编程必须具备的东西。

授人以渔,不授人以鱼。
2012-08-18 20:59
justNPC
Rank: 5Rank: 5
等 级:职业侠客
帖 子:101
专家分:311
注 册:2012-8-11
收藏
得分:6 
程序代码:
#include<stdio.h>
void main()
{
    void  a();
    void  c();
    a();        // 测试了一下 在子程序a中 定义了b,c能成功调用b           即使main中没有出现调用a的情况,c也能成功调用b
    b();          //若main出现动用b的情况 编译会报错
    c();
    getch();
}
void a()
{
    void b();
    printf("a\n");
}
void b()
{
    printf("b\n");
}
void c()
{
    b();
}
2012-08-18 21:02
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:15 
我其实当时就没太理解 main 函数声明的就是全局可见的这句话。

反证在内部声明函数不仅可读性不高,而且也没什么实际意义。
该可见的函数声明在 .h 里,谁想用谁包,还省得你查函数原型,弄不好还得写错。相当于 c++ 里的 public 接口。
不该见的自己的 .c 里自己用,别人自己然看不见。而且将来如果实现发生改变,该的有函数可能没了,只要接口没变,调用这个模块的程序都不会出问题。

这种组织文件的方法不仅很有益处,而且几乎是现在用的唯一的方式。别说内部声明了,就是外部声明一般也看不见(除非是在 .h 里)。
要么就是写那种一个文件的示例程序。可能后面加个函数,再前面补个声明方便一点。
2012-08-18 21:05
wangxiang935
Rank: 3Rank: 3
来 自:南京
等 级:论坛游侠
帖 子:177
专家分:179
注 册:2012-7-11
收藏
得分:5 
领教了~~~
2012-08-18 21:05
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:0 
而且现在 c 语言有补允函数声明的这个规则,使得这个情况更乱了。
就是说如果编译器看见了一个没见过的函数,那么它就猜这个函数的原型是一个返回 int 并以现在的调用参数为参数的例子。

比如,你写 abc("%s, %d", "abc", 10)。
如没声明,编译器会自己猜它的原型是 int abc(char *, char *, int)。这个语法点我觉得有点鸡肋,但事实好像是这样。如果 abc 的声明还真是这样的,程序就能正确执行。有些编译器可能会给点警告,但不是语法错误级别的。
2012-08-18 21:10
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
以下是引用pangding在2012-8-18 21:05:07的发言:

我其实当时就没太理解 main 函数声明的就是全局可见的这句话。

反证在内部声明函数不仅可读性不高,而且也没什么实际意义。
该可见的函数声明在 .h 里,谁想用谁包,还省得你查函数原型,弄不好还得写错。相当于 c++ 里的 public 接口。
不该见的自己的 .c 里自己用,别人自己然看不见。而且将来如果实现发生改变,该的有函数可能没了,只要接口没变,调用这个模块的程序都不会出问题。

这种组织文件的方法不仅很有益处,而且几乎是现在用的唯一的方式。别说内部声明了,就是外部声明一般也看不见(除非是在 .h 里)。
要么就是写那种一个文件的示例程序。可能后面加个函数,再前面补个声明方便一点。

因为所有非main()函数都在main()函数体内执行,即全部在main()的下层,所以main()中声明的东西在下层是天然可见的。比如C#,类内的子类可以使用父类以上的所有成员。C的嵌套语法实现不大清晰,其实不知道它到底应该是如何实现的,只是通常的实践都不搞嵌套函数,故无从考证,但道理应该是这样。

[ 本帖最后由 TonyDeng 于 2012-8-18 21:14 编辑 ]

授人以渔,不授人以鱼。
2012-08-18 21:13
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:0 
这个程序用 gcc 过不了呀:
程序代码:
#include <stdio.h>

int main()
{
    void a();
    void b();
    a();

    return 0;
}

void a()
{
    puts("a");
    b();
}

void b()
{
    puts("b");
}

2012-08-18 21:26
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:3 
学习
2012-08-18 21:37
快速回复:c的心脏——函数
数据加载中...
 
   



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

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