7

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

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

8 回答 8

14

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

于 2011-09-06T11:49:14.353 回答
9

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

于 2011-09-06T11:43:38.217 回答
1

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

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;
}
于 2011-09-06T11:44:52.470 回答
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声明:-)

于 2011-09-06T11:48:43.790 回答
1

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

至于警告main,主要的标准签名是

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

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

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

于 2011-09-06T14:23:58.823 回答
0
  1. func在调用它之前你还没有定义。
  2. 与原始行相关。
  3. 你没有返回 int。
于 2011-09-06T11:44:24.373 回答
0

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

于 2011-09-06T11:45:58.477 回答
0

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

尝试在 VS 2010 中这样做会给出:

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

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

于 2011-09-06T11:48:54.400 回答