仓鼠爱跑圈 发表于 2017-6-30 13:45:53

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

如题,请问两者有什么区别?

ba21 发表于 2017-6-30 13:58:47

这涉及 作用域的问题。
-代码块作用域(blocak scope {})
-文件作用域(file scope )
-原型作用域(prototype scope)
函数原型中声明的参数名 如:
        void func(int a, int b, int c);
-函数作用域(function scope)

在主函数里面声明,在主函数里面有效。
在主函数之前,文件作用域 在当前文件有效
放在主函数外,从它的位置往下所有的函数都能调用该函数;而在主函数内,只有主函数能访问该函数

威斯布鲁特 发表于 2017-6-30 17:25:19

本帖最后由 威斯布鲁特 于 2017-6-30 17:33 编辑

声明函数,建议声明在主函数之前。虽然我在主函数内声明,与在主函数之前声明一样,其他函数也能调用,如图


也没有警告和错误,但建议声明在主函数之前。
补充一点,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();
}

求道于盲 发表于 2017-6-30 17:53:09

函数定义是函数声明的一种
好了 下一题

威斯布鲁特 发表于 2017-6-30 18:36:24

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

我的回答是错误的,在主函数内声明,其他函数不能调用,我的碰巧通过,不符合c语言标准。

求道于盲 发表于 2017-6-30 19:43:53

威斯布鲁特 发表于 2017-6-30 18:36
我的回答是错误的,在主函数内声明,其他函数不能调用,我的碰巧通过,不符合c语言标准。

完全符合标准

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

威斯布鲁特 发表于 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');
}




贴图:

求道于盲 发表于 2017-7-1 09:23:59

威斯布鲁特 发表于 2017-7-1 08:10
我把test()和starbar()定义顺序改下就通不过了,如下所示代码:

贴图:

不是说了么
定义是声明的一种
你把要调用的函数的实现写在前面
相当于有声明这个函数

威斯布鲁特 发表于 2017-7-1 23:57:39

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


嗯,这个我能理解。虽然c语言可以不用写声明,只要预先定义了函数就可以在其他地方调用。但把函数声明写写在main()函数前面,就不会报隐式函数声明警告,也不用考虑函数定义顺序了(但一般都考虑吧)。

求道于盲 发表于 2017-7-2 02:11:49

威斯布鲁特 发表于 2017-7-1 23:57
嗯,这个我能理解。虽然c语言可以不用写声明,只要预先定义了函数就可以在其他地方调用。但把函数声明写 ...

我只是在说你前面的代码符合标准
规范的做法 会把函数声明写到自定义头文件里面
然后include
页: [1]
查看完整版本: C语言中函数声明在主函数里面和主函数之前的区别