函数定义在另一个函数定义中:它有效吗?

时间:2011-11-11 07:37:08

标签: c function

请参阅此代码

#include<stdio.h>

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

这个男女同校工作正常,并没有给出任何警告和错误。我不知道为什么会这样? 这里我在其他函数定义中写了一个函数定义,所以它有效吗?

编辑:如果是,那么是否有任何用途?

为什么gcc需要将此功能添加为扩展名...这应该是否有任何用途?!

5 个答案:

答案 0 :(得分:6)

函数定义的嵌套依赖于GCC扩展来工作。标准没有描述。

如果您希望您的代码与其他编译器一起使用,那么您应该避免使用这些技术。更重要的是,如果你与其他开发人员合作,我预测他们中的许多人会不喜欢使用这种非标准结构。

我不是GCC的专家,但我很确定有禁用扩展的编译器选项。这将允许您使编译器确保您不编写无法与其他编译器一起编译的代码。


关于您的更新,有嵌套函数的用途。它们可以通过限制范围和可见性来帮助封装。但是,如果没有嵌套函数,没有任何问题无法完全解决,我认为这解释了为什么它们是很少使用的GCC特性。

答案 1 :(得分:3)

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

答案 2 :(得分:2)

Joachim关于嵌套函数是GCC扩展的答案是正确的;您还询问是否有任何使用方法:我已经看过数百个项目的源代码,从未见过有人使用过这个特定的GCC扩展。

答案 3 :(得分: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);
}

O / P:60

答案 4 :(得分:1)

我知道GCC将此作为扩展。据我所知,这不是标准的一部分。