C中的嵌套函数?

时间:2011-05-23 10:16:34

标签: c++ c

任何人都可以告诉我,我们可以在用户定义的函数中声明一个函数吗?比如

int sum(int x, int y)
{
    int fun( float x);
}

我们可以在函数内定义一个函数吗?据我所知,我们无法在函数内定义函数。

但我刚刚做了这个并且它的工作正常,下面给出了代码:

{
    int main()
    { 
        func1();
        return 0;
    }
    func1()
    {
        int i = 0;
        auto func2()
        {
            i = 10;
            printf("Heloo i am func 2\n");
        }
        printf("Heloo i am func 1\n");
        func2();
    }
}

它非常好。

现在有谁可以告诉我如何定义函数内部的函数或正常工作?

有人可以向我解释为什么代码有效吗?

现在,当我更改几行代码时,它会给我以下问题 更改如下:

代码:

{
    func1()
    {
        func2();
        int i = 0;
        auto func2()
        {
            i = 10;
            printf("Heloo i am func 2\n");
        }
        printf("Heloo i am func 1\n");
    }

错误:

error: static declaration of ‘func2’ follows non-static declaration
note: previous implicit declaration of ‘func2’ was here

现在这些错误是什么,为什么会这样?

如果我在func2()函数中调用main,则会显示错误 undefined reference to func2

现在有人能告诉我这里有什么问题吗?

5 个答案:

答案 0 :(得分:2)

C标准允许函数内的函数的声明(如在第一个代码片段中),但不包含函数内函数的定义(尽管某些编译器可能会提供它作为非标准的扩展名。)

对于C ++也是如此,尽管较新版本(C ++ 0x等)允许您定义匿名lambda函数。但这是不同的。

答案 1 :(得分:1)

gcc allows this in C only (not C++)来自-fnested-functions,但这当然是非标准且不可移植的,所以除非你有充分的理由,否则你不应该使用嵌套函数。

答案 2 :(得分:0)

对于foo

int main(void) {
    int foo(void);
}

不是foo的定义。它是声明,它完全有效(虽然很奇怪:函数声明属于任何其他函数之外) C

C不允许的内容是定义无法嵌套的内容。

/* INAVLID EXAMPLE */
int main(void) {
    int foo(void) { return 0; }
}

答案 3 :(得分:0)

在声明之前调用func2()时,C假定(根据标准)隐式声明int func2(...),但是当编译器找到func2()定义时,它与先前的隐式声明不同,因此编译器会抱怨关于它。 如果func2()在调用func2()之前,则它既作为定义又作为声明,因此没有问题。

当然func2()无法从main()调用,因为其范围仅限于func1(),就像您无法从其他函数访问局部变量一样。

正如其他人提到的,嵌套函数在C中不是标准函数,尽管某些编译器(如GCC)支持此功能。

答案 4 :(得分:0)

这只是对 Paul R 的答案的补充。 假设您的编译器是GCC, 结束了 document保罗的回答中说:

  

嵌套函数始终没有   连锁。用extern声明一个   或static是错误的。如果你需要   以前声明嵌套函数   其定义,使用auto

所以func2必须在调用之前声明为auto 如果您更改第二个代码

func1()
{
    func2();
    int i = 0;
    ...

func1()
{
    auto func2(); /* declaration added */
    func2();
    int i = 0;
    ...

代码将被编译。