【问题标题】:Why does the following code show an error?为什么下面的代码会显示错误?
【发布时间】:2015-09-13 14:26:45
【问题描述】:
#include <stdio.h>

void m();

void n() {
    m();
}

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

编译时出错

"对 m 的未定义引用"

显示。指的是哪个m

【问题讨论】:

  • 首先你应该知道C不支持嵌套函数,如果它适合你,那是因为你的编译器允许它,但它不是可移植的。然后考虑范围,您不会期望在main 函数中定义的局部变量在全局范围内可用吗?
  • 只有一个 m 没有定义——在 ANSI C 中也没有嵌套函数

标签: c function debugging compiler-errors undefined-reference


【解决方案1】:

首先,我声明清楚,

Nested functions are not standard C. They are supported as GCC extension.

好的,现在,在您的代码中,m()main() 中的一个嵌套函数。它仅具有 main() 的块范围。在main()之外的其他函数看不到m()的存在,也不能直接调用m()m() 只能在 main() 内部调用。

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

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

另外请注意,main() 的推荐签名是int main(void)

【讨论】:

    【解决方案2】:

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

    您需要将m定义移到main 之外。最好在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;
    }
    

    【讨论】:

      猜你喜欢
      • 2014-10-22
      • 2014-06-19
      • 1970-01-01
      • 2021-06-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多