C 在main中声明的函数可以访问在main中声明的变量吗?

C 在main中声明的函数可以访问在main中声明的变量吗?,c,C,我在main中声明并初始化了一个数组,称为Edges 我还在main中声明了一些访问数组Edges的函数 代码编译并运行 它为什么有效?我认为main中声明的变量不是全局变量 编辑:请参阅Sourav的代码。您不能在C中的函数中声明函数。这意味着您不能在main中声明函数。使用-pedantic标志编译代码,您肯定会看到此警告 [Warning] ISO C forbids nested functions [-Wpedantic] 我编译了这段代码 #include <stdio.

我在main中声明并初始化了一个数组,称为Edges

我还在main中声明了一些访问数组Edges的函数

代码编译并运行

它为什么有效?我认为main中声明的变量不是全局变量


编辑:请参阅Sourav的代码。

您不能在C中的函数中声明函数。这意味着您不能在
main
中声明函数。使用
-pedantic
标志编译代码,您肯定会看到此警告

[Warning] ISO C forbids nested functions [-Wpedantic]  
我编译了这段代码

#include <stdio.h>

void void print(int *);

int main()
{
    int a[2] = {1,3};

    void print(int *a)
    {
         printf("%d", *a);
    }
    print(a);
    return 0;
}  

实际上,如果在函数内部声明函数,则内部函数只对外部函数可见,而不在
global
范围内。因此,您声明的变量和内部函数[适当地说,代码块]具有相同的作用域。因此,访问变量时没有问题

检查这个

密码 嵌套函数(annonymouse函数)不是c标准库的一部分,有一个扩展可以使用

您可以声明全局变量,并在整个程序中使用它们



Sourav实际上是正确的,您可以声明该函数,但其范围仅限于main

首先,正如大多数答案所提到的,它是一个gcc扩展;不属于标准C的一部分。
以下答案仅限于gcc。

gcc将它们视为任何其他函数

e、 g.检查以下代码:
(我冒昧地扩展了您的代码,如下所示:)

  • 函数-
    add
    sub
    nop
    -被转换为具有某些唯一随机后缀的程序集

    e.g.
    /*No .globl line is printed here.*/
    .type   add.2685, @function
    
  • 由于名称已更改,因此无法从其他函数调用它们。只有“父函数”(在本例中为getOperation)具有函数名的信息。(有关更多详细信息,请检查
    c变量范围

    但是,您可以在其他函数中使用它们,使用函数指针,如上面的代码所示

    关于
    getOperation
    中的局部变量(例如
    a
    ):使用
    rbp
    寄存器从
    add
    /
    sub
    /
    nop
    访问它们。

    提示:使用
    gcc-S
    编译一个具有“本地函数”的小代码,以了解到底发生了什么…:)

    那么,当我在main中声明一个函数时,我要声明什么呢?@user2108462您可能正在使用一个允许您这样做的编译器,在这种情况下,您需要查看它的文档,了解它是如何工作的。(或者告诉我们您使用什么编译器,以便我们可以为您执行此操作)我正在linux上使用gcc。您能显示您的代码吗?显示您的代码。我对main中的函数很困惑。代码超过1100行,所以我将给出一个itOkay的摘要,我用我的代码更新了它。这段代码甚至可以编译?所以main中声明的任何函数都可以访问main中声明的任何变量?@user2108462首先获取概念。该内部函数不能作为适当的
    函数调用。这是一个简单的
    代码块
    ,就像main中的其他行一样。这完全是误导。使用
    -pedantic
    标志编译代码。嵌套函数在C.yer中是不允许的,因为main的行为有点像外部容器。但是,Sourav还是正确的,它只是一个代码块,因此不需要整个函数声明。我认为嵌套函数是gcc唯一的东西。这与c有什么关系?
    #include <stdio.h>
    #include <stdlib.h>
    
    int innerfunc();
    
    int main()
    {
    
            int outer = 5;
            int innerfunc()
            {
                    printf("outer is %d\n", outer);
            }
            innerfunc();
            return 0;
    }
    
    [sourav@infba01383 so_overflow]# ./a.out 
    outer is 5
    [sourav@infba01383 so_overflow]#
    
    #include <stdio.h>
    #include <stdlib.h>
    
    typedef int operation(int num1, int num2); // for function pointer...
    
    operation* getOperation(char oper)
    {
        int a=10;
        int add(int x, int y){return x+y+a;}
        int sub(int x, int y){return x-y+a;}
        int nop(int x, int y){return a;}
    
        if(oper=='+')return add;
        if(oper=='-')return sub;
        return nop;
    }
    
    int main()
    {
        operation *my_op;
    
        my_op=getOperation('+');
        printf("%d\n",my_op(5,3));
    
        my_op=getOperation('-');
        printf("%d\n",my_op(5,3));
    
        return 0;
    
    }
    
    e.g.
    .globl  getOperation /*This line will be missing in case of static functions.*/
    .type   getOperation, @function
    
    e.g.
    /*No .globl line is printed here.*/
    .type   add.2685, @function