繁体   English   中英

为什么以下代码显示错误?

[英]Why does the following code show an error?

#include <stdio.h>

void m();

void n() {
    m();
}

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

编译时出现错误

“对m的未定义引用”

显示。 指的是哪个m

首先,让我明确声明,

嵌套函数不是标准C 支持它们作为GCC扩展。

OK,现在,在您的代码中, m()main()内部的嵌套函数。 它仅具有main()块作用域。 main()其他函数看不到m()的存在,也不能直接调用m() m()只能在main()内部调用。

在您的情况下,对n() m()的调用导致了此问题。 即使您将前向声明提供为void m(); ,链接器将无法找到m()的定义并抛出错误。

解决方案:m()的定义移到main() m()之外,然后可以从任何其他函数中使用它。

还要注意, main()的推荐签名是int main(void)

正如其他地方所解释的那样,C通常不支持嵌套函数(gcc作为扩展,但据我所知几乎没有其他编译器支持)。

您需要将m定义移到main之外。 最好在n使用n之前定义m

#include <stdio.h>

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

void n()
{
  m();
}

int main( void ) // void main() is not a valid signature for main
{
  n();       // call n, which calls m, which prints "hi"
  return 0;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM