gpt4 book ai didi

c - 在另一个函数中定义时的函数范围

转载 作者:太空狗 更新时间:2023-10-29 16:12:07 24 4
gpt4 key购买 nike

当一个函数定义在另一个函数中时会发生什么?代码 1 和代码 2 有什么区别?

代码 1:

#include<stdio.h>

void m();

void main()
{
m();
void m()
{
printf("hi");
}
}

代码 2:

#include <stdio.h>

void m();

void main()
{
void m()
{
printf("hi");
}
m();
}

当我在 gcc 编译器中编译代码 1 时,出现链接错误。但是当我编译代码2时,我没有得到任何错误。我得到输出 "hi"。我想知道编译是如何完成的,当我们在另一个函数中编写函数定义时。我知道当我们不在另一个函数中编写函数定义时,无论函数定义在哪里,我们在调用该函数时都不会出现任何错误。 例如看下面的代码:


代码 3:

#include <stdio.h>
void m();
void main()
{
m();
}

void m()
{
printf("hi");
}

代码 3 中,即使我在定义之前调用函数,它也没有显示任何错误并且我得到了输出。为什么代码 1 没有发生。

最佳答案

C 和 C++ 都不允许在另一个函数中定义一个函数。因此,您似乎正在使用编译器 GCC 的特殊语言扩展,允许在另一个函数内定义本地函数。

在第一个程序中,函数 m 在文件范围内声明。所以它的定义将被编译器在文件范围内搜索。当函数在 main 内部调用时,只有这个文件范围声明是可见的。然而,编译器没有找到它的文件作用域定义,所以它发出了一个错误。

在第二个程序中,文件范围内也有函数 m 的声明。但是在函数 main 中还有另一个函数 m 的声明,它具有 block 作用域并隐藏了文件作用域的声明。考虑到定义也是声明。所以 m 的调用是指在 main 内部声明的函数 m 并且具有 block 作用域。编译器有函数定义,可以调用。

在满足C标准的第三个程序中,main里面m的调用引用了文件作用域中声明的函数m,文件作用域中有这个函数的定义。所以没有任何问题。

关于c - 在另一个函数中定义时的函数范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27014722/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com