C语言中的函数内部定义函数

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

18
void main 啊啊啊啊啊啊啊啊啊啊啊啊! - pmg
1
此外,在C语言中,main()函数返回int类型。 - Pascal Cuoq
1
这表明你没有在读一本好书。 《C语言权威指南与书单》- https://dev59.com/DHRB5IYBdhLWcg3wpYqo - Sadique
6
我很想知道为什么人们会对void main()这种写法感到如此困扰。C标准并没有禁止使用它。 - Oliver Charlesworth
3
我认为C语言允许嵌套类,因为以下代码可以正常工作。请点击链接查看详细信息:https://dev59.com/F3E85IYBdhLWcg3wzWzM - Sadique
显示剩余5条评论
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获取更多详细信息。


9

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


至少作为C语言的GCC“扩展”,它确实支持嵌套函数。 - Justin
1
显然(从错误信息可以看出),他正在使用gcc,而gcc实际上具有嵌套函数! - Nordic Mainframe
@Justin 好的,更准确地说,是 ANSI C。 - Mu Qiao
@Oli 说得对,但发帖者说的是“C”,而不是“ANSI C”。 - Justin
@Oli:OP没有说他使用 ANSI-C。 - Nordic Mainframe

1

标准的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;
}

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声明 :-)

1

嵌套函数是gcc特有的扩展,并不被普遍支持。

至于关于main的警告,标准的main签名为

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

实现可能提供额外的签名(一些编译器允许第三个参数用于环境变量),但这些额外的签名必须由实现文档记录;换句话说,如果您的编译器文档没有明确列出,则void main()只是main的有效签名。

如果不确定,请使用上述标准签名之一。


0
  1. 在调用函数之前,您还没有定义func
  2. 与原始行相关联。
  3. 您没有返回整数。

0

如果您在int变量声明中删除func()的声明,它将正常工作。


0

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

在VS 2010中尝试这样做会出现以下错误:

'funct' : local function definitions are illegal

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接