在另一个函数定义中定义函数:是否有效?

6

看这段代码

#include<stdio.h>

int main()
{
    void test(void)
    {
        printf("test");
        return;
    }
printf("main");
return 0;
}

这段代码运行良好,没有任何警告和错误。我不知道为什么会这样?

编辑:如果是这样的话,这个有用吗?

为什么gcc需要添加这些扩展功能...难道它没有任何用处吗?!


1
看起来是一个重复的问题:https://dev59.com/xEbRa4cB1Zd3GeqP5PJK 你可能会感兴趣看看这个:https://dev59.com/FXM_5IYBdhLWcg3wgzdl & http://www.informit.com/articles/article.aspx?p=1676713 - another.anon.coward
@another.anon.coward,感谢您提供的链接... - Jeegar Patel
5个回答

7
函数定义的嵌套依靠GCC扩展来完成,这不是标准所描述的。如果您希望您的代码能够在其他编译器中运行,则应避免使用此类技术。而且,如果您与其他开发人员合作,我预测他们中的许多人将不喜欢使用这种非标准结构。我对GCC并不是很了解,但我相当确定有编译器选项可以禁用扩展。这将使您的编译器确保您不会编写不能在其他编译器上编译的代码。
关于您的更新,嵌套函数有其用途。它们可以通过限制范围和可见性来帮助封装。然而,没有无法完全充分解决的问题,没有必要使用嵌套函数,这也解释了为什么它们很少被使用,是GCC的特殊之处。

你真是个天才...你给了我这么多问题的答案..!! - Jeegar Patel
为什么在C89和C99标准中没有定义函数内部的函数? - Sahil
3
因为 C 语言并非以这种方式设计而成。 - David Heffernan

3

定义嵌套函数(即在另一个函数内部定义函数)是有效的,唯一的限制是前一个函数的范围受到封闭函数的限制。这就像定义局部变量一样。您可以在此处找到更多信息:http://gcc.gnu.org/onlinedocs/gcc/Nested-Functions.html


2

是的,我们可以在其他函数中定义一个函数。我已经在gcc中编译了以下写入的行,并且成功地运行而没有显示错误。

#include<stdio.h>;
void main()
{
    int sum()
    {
        int a=30, b=10, c=20, sum=0;
        sum=a+b+c;
        return sum;
    }
    int a;
    a=sum();
    printf("Sum = %d", a);
}

输出:60


2

Joachim提到的嵌套函数是GCC扩展的说法是正确的;你还问是否有任何用途:我看过数百个项目的源代码,从未见过任何人使用这个特定的GCC扩展。


1

我知道GCC有这个扩展。据我所知,它不是标准的一部分。


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