鱼C论坛

 找回密码
 立即注册
查看: 3888|回复: 9

C语言中函数声明在主函数里面和主函数之前的区别

[复制链接]
发表于 2017-6-30 13:45:53 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
如题,请问两者有什么区别?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2017-6-30 13:58:47 | 显示全部楼层
这涉及 作用域的问题。
-代码块作用域(blocak scope {})
-文件作用域(file scope )
-原型作用域(prototype scope)
  函数原型中声明的参数名 如:
        void func(int a, int b, int c);
-函数作用域(function scope)

在主函数里面声明,在主函数里面有效。
在主函数之前,文件作用域 在当前文件有效
放在主函数外,从它的位置往下所有的函数都能调用该函数;而在主函数内,只有主函数能访问该函数
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-6-30 17:25:19 | 显示全部楼层
本帖最后由 威斯布鲁特 于 2017-6-30 17:33 编辑

声明函数,建议声明在主函数之前。虽然我在主函数内声明,与在主函数之前声明一样,其他函数也能调用,如图
360截图20170630171032300.jpg
360截图20170630171050675.jpg
也没有警告和错误,但建议声明在主函数之前。
补充一点,c语言也可以不声明调用函数,但会报警告:
implicit declaration of function 'starbar' [-Wimplicit-function-declaration]( 隐式申明函数)

这是代码:
  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. #define NAME "GIGATHINK, INC."
  4. #define ADDRESS "101 Megabuck Plaza"
  5. #define PLACE "Megapolis, CA 94904"
  6. #define WIDTH 40

  7. int main()
  8. {
  9.    void starbar();
  10.    void test();

  11.    test();
  12.    printf("%s\n", NAME);
  13.    printf("%s\n", PLACE);
  14.    printf("%s\n", ADDRESS);
  15.    starbar();
  16.    return 0;
  17. }

  18. void starbar(void)
  19. {
  20.     int count;

  21.     for(count = 1; count <= WIDTH; count++)
  22.         putchar('*');

  23.         putchar('\n');
  24. }

  25. void test(void)
  26. {
  27.     starbar();
  28. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-6-30 17:53:09 | 显示全部楼层
函数定义是函数声明的一种
好了 下一题
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-6-30 18:36:24 | 显示全部楼层
威斯布鲁特 发表于 2017-6-30 17:25
声明函数,建议声明在主函数之前。虽然我在主函数内声明,与在主函数之前声明一样,其他函数也能调用,如图 ...


我的回答是错误的,在主函数内声明,其他函数不能调用,我的碰巧通过,不符合c语言标准。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-6-30 19:43:53 From FishC Mobile | 显示全部楼层
威斯布鲁特 发表于 2017-6-30 18:36
我的回答是错误的,在主函数内声明,其他函数不能调用,我的碰巧通过,不符合c语言标准。

完全符合标准

函数的定义是函数声明的一种
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-7-1 08:10:17 | 显示全部楼层
求道于盲 发表于 2017-6-30 19:43
完全符合标准

函数的定义是函数声明的一种

我把test()和starbar()定义顺序改下就通不过了,如下所示代码:
  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. #define NAME "GIGATHINK, INC."
  4. #define ADDRESS "101 Megabuck Plaza"
  5. #define PLACE "Megapolis, CA 94904"
  6. #define WIDTH 40

  7. int main()
  8. {
  9.    void starbar();
  10.    void test();

  11.    test();
  12.    printf("%s\n", NAME);
  13.    printf("%s\n", PLACE);
  14.    printf("%s\n", ADDRESS);
  15.    starbar();
  16.    return 0;
  17. }

  18. void test(void)
  19. {
  20.     starbar();
  21. }

  22. void starbar(void)
  23. {
  24.     int count;

  25.     for(count = 1; count <= WIDTH; count++)
  26.         putchar('*');

  27.         putchar('\n');
  28. }



复制代码

贴图:
360截图20170701080932859.jpg
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-7-1 09:23:59 From FishC Mobile | 显示全部楼层
威斯布鲁特 发表于 2017-7-1 08:10
我把test()和starbar()定义顺序改下就通不过了,如下所示代码:

贴图:

不是说了么
定义是声明的一种
你把要调用的函数的实现写在前面
相当于有声明这个函数
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-7-1 23:57:39 | 显示全部楼层
求道于盲 发表于 2017-7-1 09:23
不是说了么
定义是声明的一种
你把要调用的函数的实现写在前面

嗯,这个我能理解。虽然c语言可以不用写声明,只要预先定义了函数就可以在其他地方调用。但把函数声明写写在main()函数前面,就不会报隐式函数声明警告,也不用考虑函数定义顺序了(但一般都考虑吧)。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-7-2 02:11:49 From FishC Mobile | 显示全部楼层
威斯布鲁特 发表于 2017-7-1 23:57
嗯,这个我能理解。虽然c语言可以不用写声明,只要预先定义了函数就可以在其他地方调用。但把函数声明写 ...

我只是在说你前面的代码符合标准
规范的做法 会把函数声明写到自定义头文件里面
然后include

评分

参与人数 1荣誉 +2 鱼币 +4 贡献 +1 收起 理由
威斯布鲁特 + 2 + 4 + 1 收获很多。

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-7 17:30

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表