Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C中的嵌套函数?_C++_C - Fatal编程技术网

C++ C中的嵌套函数?

C++ C中的嵌套函数?,c++,c,C++,C,有人能告诉我我们能在用户定义函数中声明函数吗?比如 int sum(int x, int y) { int fun( float x); } 我们可以在函数中定义函数吗?我知道我们不能在函数中定义函数 但我只是这样做了,它的工作很好。下面给出了代码: { int main() { func1(); return 0; } func1() { int i = 0; auto func

有人能告诉我我们能在用户定义函数中声明函数吗?比如

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
这些错误是什么?为什么会出现

如果我在
main
函数中调用
func2()
,它将显示如下错误
对func2的未定义引用

现在有谁能告诉我这里出了什么问题吗?

C标准允许在函数中声明函数(如您的第一个代码片段),但不允许在函数中定义函数(尽管有些编译器可能将其作为非标准扩展提供)


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

通过
-fnested functions
,但这当然是非标准和不可移植的,所以除非有很好的理由,否则您可能不应该使用嵌套函数。

这是因为
foo

int main(void) {
    int foo(void);
}
不是
foo
的定义。它是一个声明,在
C
中完全有效(尽管很奇怪:函数声明不属于任何其他函数)

C
不允许的是,定义不能嵌套

/* INAVLID EXAMPLE */
int main(void) {
    int foo(void) { return 0; }
}
当您在声明之前调用
func2()
时,C(根据标准)假定隐式声明
int func2(…)
,但当编译器找到
func2()
定义时,它与以前的隐式声明不同,所以编译器对此表示不满。 如果调用
func2()
之前有
func2()
,则它同时充当定义和声明,因此没有问题

当然,不能从
main()
调用
func2()
,因为它的作用域仅限于
func1()
,就像不能从另一个函数访问局部变量一样


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

这只是Paul R答案的补充。 假设您的编译器是GCC, 世界末日 保罗在回答中说:

嵌套函数始终没有 联系。用
extern
静态
错误。如果你需要 在之前声明嵌套函数的步骤 其定义,使用
auto

因此,在调用它之前,必须将
func2
声明为
auto

如果您更改第二个代码

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


代码将被编译。

太多的问号……应该注意的是,这是否被允许只是语言书呆子的好奇。在现实世界的应用程序中,您永远不会在其他函数中编写声明或定义。pal在定义之前调用func2时发生了什么错误?我想知道这有什么不同。代码为什么要执行?@user:可能您是在使用支持嵌套函数的编译器进行编译。它可能需要在调用函数之前声明函数(对于“标准”非嵌套函数来说,这当然是正确的)。在不起作用的代码段中,情况并非如此。
func1()
{
    auto func2(); /* declaration added */
    func2();
    int i = 0;
    ...