繁体   English   中英

C中的函数内部函数

[英]Function inside function in C

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

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

您正在使用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

ANSI C不允许嵌套函数定义。 你的main函数应该返回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;
}

您正在采取的是GCC特定功能 ,它从未成为“适当的”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声明:-)

嵌套函数是特定于gcc的扩展 ; 它们并非得到普遍支持。

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

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

实现可以提供额外的签名(一些编译器允许环境变量的第三个参数),但这些附加签名必须由实现记录; IOW, void main()只适用于有效的签名main ,如果你的编译器的文档明确地列出了它本身。

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

  1. 你没有在调用之前定义func
  2. 与原始线路相关联。
  3. 你没有返回int。

如果删除int变量声明中的func()声明,它就有效。

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

试图在VS 2010中这样做:

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

您需要移动该函数并将其声明移出main。

暂无
暂无

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

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