Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C中函数内部的函数_C_Gcc_Nested Function - Fatal编程技术网

C中函数内部的函数

C中函数内部的函数,c,gcc,nested-function,C,Gcc,Nested Function,任何人请详细说明这些错误:- 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”的静态

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

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");
}

ANSI C不允许嵌套函数定义。主函数应该返回int

  • 在调用它之前,您没有定义
    func
  • 返回到原始行
  • 你没有返回int

  • 标准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;
    }
    
    intmain()
    {
    int a=5,b=60,func();
    printf(“\nI am in main-1”);
    
    int func();//如果在
    int
    变量声明中删除
    func()
    的声明,则它可以工作。

    您所考虑的是a,它从来不是“正确的”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();
    }
    
    #包括
    INTA=20,b=11;
    int main(int argc,char*argv[])
    {
    INTA=5,b=60;
    自动整型函数(无效);
    printf(“\nI am in main-1”);
    int func(void)
    {
    printf(“\n我在功能中”);
    返回1;
    }
    printf(“\nI am in main-2”);
    返回func();
    }
    
    以前的代码不起作用的原因是嵌套函数没有链接:

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


    上面的示例使用了
    auto
    关键字。我还擅自修复了
    main
    声明:-)

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

    在VS 2010中尝试这样做会带来:

    'funct':本地函数定义是非法的


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

    您使用的是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;
    }
    
    inta=20,b=11;
    int main()
    {
    INTA=5,b=60;
    
    auto int func();//嵌套函数是特定于gcc的;它们不受普遍支持

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

    int main(void)
    int main(int argc, char **argv) // or equivalent
    
    一个实现可以提供额外的签名(一些编译器允许环境变量使用第三个参数),但是这些额外的签名必须由实现记录下来如果编译器文档明确列出了
    main
    ,则它仅是
    main的有效签名


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

    void main
    arrrrrrrgggggghhhhhh!另外,
    main()
    返回C中的
    int
    ,这表明你没有在读一本书,这是一本好书。
    权威的C图书指南和列表
    -@pmg:我总是想知道为什么人们对
    void main()如此烦恼
    。C标准并没有禁止它。@OP-
    我认为C允许嵌套类,因为下面的代码运行良好
    -别想,开始阅读buddy:-)-(至少作为C的GCC“扩展”)显然(从错误消息中可以看出),他使用的是gcc,它实际上有嵌套函数!@justinok,更准确地说,是ANSIC@Oli很公平,但海报上写的是“C”,而不是“ANSI C”。@Oli:OP没有说他使用ANSI-C