为什么下面的代码显示一个错误?(Why does the following code show a

2019-10-23 12:47发布

#include <stdio.h>

void m();

void n() {
    m();
}

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

在编译,错误

“未定义参考到m”

被示出。 这m被称为?

Answer 1:

首先,我要申报清楚,

嵌套函数不是标准C 他们也支持GCC扩展。

好了,现在,在你的代码, m()里面嵌套函数main() 。 它是具有用于块范围main()唯一的。 外main()的其它功能不能看到的存在m()也不能调用m()直接。 m()可以被称为仅内部main()

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

解决方案:移动的定义, m()main()那么你可以从任何其他函数中使用它。

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



Answer 2:

正如已经在别处解释,C不支持嵌套函数作为规则(GCC不作为扩展,但几乎没有其他的编译器,我知道的一样)。

你需要移动的定义 m外的main 。 优选地应定义m它由前n

#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;
}


文章来源: Why does the following code show an error?