鱼C论坛

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

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

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

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

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

x
如题,请问两者有什么区别?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

在主函数里面声明,在主函数里面有效。
在主函数之前,文件作用域 在当前文件有效
放在主函数外,从它的位置往下所有的函数都能调用该函数;而在主函数内,只有主函数能访问该函数
想知道小甲鱼最近在做啥?请访问 -> 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]( 隐式申明函数)

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

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

int main()
{
   void starbar();
   void test();

   test();
   printf("%s\n", NAME);
   printf("%s\n", PLACE);
   printf("%s\n", ADDRESS);
   starbar();
   return 0;
}

void starbar(void)
{
    int count;

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

        putchar('\n');
}

void test(void)
{
    starbar();
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-6-30 17:53:09 | 显示全部楼层
函数定义是函数声明的一种
好了 下一题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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


我的回答是错误的,在主函数内声明,其他函数不能调用,我的碰巧通过,不符合c语言标准。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

完全符合标准

函数的定义是函数声明的一种
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

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

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

int main()
{
   void starbar();
   void test();
 
   test();
   printf("%s\n", NAME);
   printf("%s\n", PLACE);
   printf("%s\n", ADDRESS);
   starbar();
   return 0;
}

void test(void)
{
    starbar();
}

void starbar(void)
{
    int count;

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

        putchar('\n');
}
贴图:
360截图20170701080932859.jpg
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

贴图:

不是说了么
定义是声明的一种
你把要调用的函数的实现写在前面
相当于有声明这个函数
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

嗯,这个我能理解。虽然c语言可以不用写声明,只要预先定义了函数就可以在其他地方调用。但把函数声明写写在main()函数前面,就不会报隐式函数声明警告,也不用考虑函数定义顺序了(但一般都考虑吧)。
想知道小甲鱼最近在做啥?请访问 -> 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 收获很多。

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-28 08:31

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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