首页 > C语言里,函数里面不能嵌套函数?

C语言里,函数里面不能嵌套函数?

# include <stdio.h>


int main(void)
{
    int a = 1;
    int b = 2;
    
    
    void f(void)
    {
        a = b;
        b = a;
        printf("a:%d, b:%d\n",a,b);
    }

    f();

    return 0;
}

这里为什么报错????

建议多看看基础的书.

# include <stdio.h>

int a = 0; // f 调用的是我
int b = 0; // f 调用的是我

void f(void)
{
    // 此处使用的是全局变量
    printf("a:%d, b:%d\n",a,b);
}

int main(void)
{
    // 这里的 a & b 是局部变量 只对main 函数生效 外部是无法调用的
    int a = 1;
    int b = 2;
    
    f();

    return 0;
}

直接 在函数外部定义变量试试 .


这种嵌套函数,在不同上下文里调用你这个函数,修改的变量是不一样的,也就是函数实际行为是动态的,而C语言是编译型的语言,一个函数的机器码编译时就确定了,而且变量名在编译成机器语言就没有了,所以你这个要标准C不支持的。
不过在C++里,你这个嵌套函数,捕获外部变量的要求是可以用lambda表达式实现的


作用域是在编译的过程中就确定的,而不是运行的时候动态变换。
f这个函数它所在的父作用域就是全局环境,而不是main函数这个环境。
在main函数中只是调用了f这个函数,并不是定义,故f不可能访问到main中的所有变量。
你可以理解为f与main是两个有独立环境的函数,它们可以相互调用,但是不能直接访问对方的内部变量。
要想达到你所说的要求,方法可以是把main中的a与b提升为全局变量。


你这种写法是nested function,嵌套定义函数

C99标准以及C++规范中均不支持nested function

GNU C 扩展规范中支持nested function,实测使用gcc编译也确实输出了a:2 b:2的正确结果

但其他的C编译器,以及所有的C++编译器(包括g++)均不支持,并且这种写法也是不被推荐的

【热门文章】
【热门文章】