在C中的函数中声明的函数,它们在全局范围内可用吗?

在C中的函数中声明的函数,它们在全局范围内可用吗?,c,function,scope,C,Function,Scope,我遇到了一个小问题,关于看人,目前通过评分帮助老师,看到人们在main范围内声明函数,而不是像我被教导的那样在全局范围内,我知道这本身仍然有效,但是我有点困惑这些函数会发生什么,如果一个函数被调用,在main中声明,在另一个没有在main中声明的函数中,这个函数本身会工作吗?如果它工作,为什么。函数不只是在main的作用域内吗?因此,它不应该保持它的局部性吗?或者,从它被声明并随后被定义时起,C只是在全局作用域中为函数调用分配内存空间吗?我知道我在这个问题上有点漫无边际,试图涵盖这个范围内所有可

我遇到了一个小问题,关于看人,目前通过评分帮助老师,看到人们在main范围内声明函数,而不是像我被教导的那样在全局范围内,我知道这本身仍然有效,但是我有点困惑这些函数会发生什么,如果一个函数被调用,在main中声明,在另一个没有在main中声明的函数中,这个函数本身会工作吗?如果它工作,为什么。函数不只是在main的作用域内吗?因此,它不应该保持它的局部性吗?或者,从它被声明并随后被定义时起,C只是在全局作用域中为函数调用分配内存空间吗?我知道我在这个问题上有点漫无边际,试图涵盖这个范围内所有可能的问题。 我的意思的样本

int main(){  
  void foo(int bar);
  int boo;
  foo(boo);
  return 0;
}

void foo(int bar){
  ...
}
我想强调的一点是,函数是可用的,因为它们通过main(如果有意义的话)是相关的,但是函数是否应该在全局范围内声明,例如

#include <stdio.h>

void roo(void);

int main(){} //Holds the same syntax as above with the function declared within it.
//Function foo is same as defined prior.
//Then function roo is defined but uses foo within itself.

void roo(void){
int boo;
foo(boo);
...
}
#包括
无效roo(void);
int main(){}//具有与上面相同的语法,其中声明了函数。
//函数foo与前面定义的相同。
//然后定义函数roo,但在其内部使用foo。
无效roo(无效){
int boo;
foo(boo);
...
}
由于函数roo在技术上无法访问main范围内的函数,所以被复合的代码不应该完全工作吗

编辑--


我看到了一点,main在当前缺少多个要调用的函数的情况下,在调用函数roo时仍然会被使用,但是如果它包含多个函数,那么从roo内部调用foo不是有点奇怪或者语法不合法吗,如果它在main外部被缩放大约6个函数

类型检查和链接需要声明。它们只在编译时存在——它们实际上并不创建以任何方式存在于已编译程序中的“对象”(如函数体)——它们所做的只是在其上加上一个名称,以便源代码的其他部分可以引用该对象,而无需立即将其放在手边。定义创建对象,但声明创建名称

通过您的示例:

void roo(void);  // roo becomes visible

int main(){  // main is defined, AND becomes visible
    void foo(int bar);  // foo becomes visible
    foo(6);
    roo();
}  // foo is no longer visible

void foo(int bar){ /**/ }  // foo is defined AND becomes visible

void roo(void){  // roo is defined, but was already visible
    foo(6);      //  so this has no effect on other functions
}
  • roo
    可以从下面声明它的程序中的任何代码调用,因为它的名称已放在全局范围内,并且在所有嵌套范围中都可见。下面的代码知道在某个地方(不知道在哪里),有一个名为
    roo
    的函数存在并可供使用

  • 向下移动到
    main
    ,将打开一个新的作用域,并在其中显示
    foo
    main
    使用此信息调用
    foo
    。它使用全局范围中的信息来调用
    roo
    。范围随着
    main
    的结束而关闭,
    foo
    对以下代码不再可见;它不知道有任何这样的功能存在

  • foo
    是在全局范围内同时定义和声明的。以下所有代码都知道名为
    foo
    的函数可供使用

  • 类似地,对于
    roo

  • 任何东西在内存中被给予空间的唯一位置是在定义的三个点上。所有声明都不会导致任何分配,无论是静态分配还是其他分配。它们所做的只是让代码知道其他地方的分配(由链接器解决)


    因此,(我认为是)最初的混淆点:
    main
    调用
    roo
    roo
    调用
    foo
    ,但是
    main
    中的
    foo
    声明对
    roo
    是不可见的。(听起来你混淆了静态和动态语义:C只有静态作用域。)

    这不是问题,因为
    main
    不知道
    roo
    的内容,也不需要知道它的内容(一些编译器执行内联;我们不关心这一点)。控件离开
    main的主体代码
    并转到程序中的另一点。一个函数的主体是其他函数的黑匣子;
    roo
    的代码中发生了什么,其他所有函数都完全不知道
    roo
    也不继承
    main
    的作用域,因此它不知道当时声明的任何内容(全局、本地或其他)-它使用由自己的主体进一步向下打开和关闭的作用域进行名称查找。在该范围中,
    foo
    已经全局声明(它在页面上的一个单独的固定点继承全局范围),因此
    roo
    可以自动查看
    foo


    每个函数都存在于一个(且恰好存在于一个)位置。所有声明所做的就是使该位置对使用它的代码可见。不使用它的代码不需要能够看到它
    main
    无法看到对
    foo
    的嵌套调用,因此此时的任何声明都与之无关。

    在函数中定义函数在某些编译器中是合法的,但在一般语言中不可用。(例如,它是gnu扩展)只要在调用函数之前有一个函数声明,就可以调用它。您展示的代码片段完全合法。您的问题和代码示例似乎描述了不同的事情。也许你可以扩展这个例子来展示你所设想的一切?好的。这是我解释的重点,我不确定如何正确地表达它,但我可以稍微整理一下代码片段,对其他人的回答,谢谢。有人告诉我,由于可读性的原因,这是一种不好的做法,我不知道这是威利安珀塞尔·约阿奇姆皮勒堡的独家编译器,你们有些自相矛盾