【问题标题】:Function inside function in CC中的函数内部函数
【发布时间】:2011-11-11 06:29:25
【问题描述】:

请任何人详细说明这些错误:-

void main()
{
    int a=5, b=60, func();

    printf("\nI am in main-1");

    int func(){
        printf("\nI am in funct");
        return 1;
    }
    func();
    printf("\nI am in main-2");
}

我得到的错误是:

  • 在函数“main”中:
  • 第 8 行:错误:“func”的静态声明遵循非静态 声明
  • 第 4 行:错误:'func' 的先前声明在这里
  • 第 3 行:警告:'main' 的返回类型不是 'int'

我认为 C 允许嵌套类,因为以下代码运行良好:

void outerfunc()
{
    int func()
    {
        printf("\nI am in funct");
        return 1;
    }

    func();
}

void main()
{
    printf("\nI am in main-1");

    outerfunc();
    printf("\nI am in main-2");
}

【问题讨论】:

  • void main ARRRRRRRRGGGGGGGGHHHHHHHH!
  • 另外,main() 在 C 中返回 int
  • 这表明你不是在看书,而是一本好书。 The Definitive C Book Guide and List - stackoverflow.com/questions/562303/…
  • @pmg:我一直想知道为什么人们会对void main() 如此烦恼。 C 标准并没有禁止它。
  • @OP - I think C allows nested class because the following code is working fine - 别想了,开始读哥们:-) - stackoverflow.com/questions/2608158/nested-function-in-c

标签: c gcc nested-function


【解决方案1】:

您正在使用 GNU C 编译器的扩展,它允许声明嵌套函数。错误来自这样一个事实,即 GCC 扩展下的嵌套函数的前向声明需要在前面加上 auto 关键字。

int a=20,b=11;
int main()
{
  int a=5, b=60; 
  auto int func(); // <--------- here
  func(); // <- call it
  printf("\nI am in main-1");

  int func(){
  printf("\nI am in funct");
  return 1;
  }

printf("\nI am in main-2");
 return 0;
}

更多详情请见http://gcc.gnu.org/onlinedocs/gcc/Nested-Functions.html

【讨论】:

    【解决方案2】:

    ANSI C 不允许嵌套函数定义。并且你的 main 函数应该返回 int

    【讨论】:

    • Yes it does(至少作为 C 的 GCC“扩展”)
    • 显然(从错误信息中可以看出),他使用的 gcc 实际上有嵌套函数!
    • @Justin 好的,更准确地说,ANSI C
    • @Oli 很公平,但发帖人说的是“C”,而不是“ANSI C”。
    • @Oli:OP没有说他使用ANSI-C
    【解决方案3】:

    在标准 C/C++ 中不允许使用嵌套函数。如果您想稍后定义它,只需(转发)在main() 中声明func()

    int main()
    {
      int a=5, b=60, func();
    
    printf("\nI am in main-1");
    
      int func();  // <---- declare inside main()
    
    printf("\nI am in main-2");
    }
    
    
    int func(){    // <---- define later
      printf("\nI am in funct");
      return 1;
    }
    

    【讨论】:

      【解决方案4】:

      您所讨论的是GCC specific feature,它从来都不是“正确”的 C 功能(即 ANSI C 规范的一部分)。

      如果您想使用此功能,那么我相信您所追求的是:

      #include <stdio.h>
      
      int a = 20, b = 11;
      
      int main( int argc, char* argv[] )
      {
          int a = 5, b = 60;
          auto int func( void );
      
          printf("\nI am in main-1");
      
          int func( void )
          {
              printf("\nI am in funct");
              return 1;
          }
      
          printf("\nI am in main-2");
          return func();
      }
      

      您之前的代码不起作用的原因是嵌套函数没有链接:

      嵌套函数始终没有链接。用 extern 或 static 声明一个是错误的。如果需要在定义嵌套函数之前声明嵌套函数,请使用 auto(否则对函数声明没有意义)。

      以上示例因此使用了auto 关键字。我还冒昧地修复了您的 main 声明 :-)

      【讨论】:

        【解决方案5】:

        嵌套函数是 gcc 特有的extension;它们没有得到普遍支持。

        关于main 的警告,main 的标准签名是

        int main(void)
        int main(int argc, char **argv) // or equivalent
        

        实现可能提供额外的签名(一些编译器允许环境变量的第三个参数),但那些额外的签名必须由实现记录; IOW,void main() 仅是 main 的有效签名,前提是您的编译器文档明确列出了它。

        如有疑问,请使用上述标准签名之一。

        【讨论】:

          【解决方案6】:
          1. 在调用func 之前,您还没有定义它。
          2. 与原始行相关。
          3. 您没有返回 int。

          【讨论】:

            【解决方案7】:

            如果您在int 变量声明中删除func() 的声明,它会起作用。

            【讨论】:

              【解决方案8】:

              C++ 不允许函数包含在其他函数中。

              尝试在 VS 2010 中这样做:

              'funct' : 局部函数定义是非法的

              您需要将该函数及其声明移到 main 之外。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2016-03-14
                • 1970-01-01
                • 2020-12-03
                • 2012-07-07
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多