C++ 在函数中声明函数的用法?

C++ 在函数中声明函数的用法?,c++,function,function-declaration,C++,Function,Function Declaration,可能重复: 我知道在函数内部我们可以声明一个函数。它有什么用?你能举个简单的例子吗?AFAIK,在C/C++中定义函数是非标准的,只有一些编译器支持它。但是,你可以使用新的C++特性,即所谓的lambda函数。 在其他函数中定义函数(或lambda函数)可能有几种有用的方式(取决于实现): 您可以将相关代码保持在较近的位置,这样更易于阅读和理解 内部函数可以直接访问外部函数的变量(因此,作为参数显式传递的内容更少) 另外,在C/C++中定义函数是非标准的,只有一些编译器支持它。但是,你可以使用

可能重复:


我知道在函数内部我们可以声明一个函数。它有什么用?你能举个简单的例子吗?

AFAIK,在C/C++中定义函数是非标准的,只有一些编译器支持它。但是,你可以使用新的C++特性,即所谓的lambda函数。 在其他函数中定义函数(或lambda函数)可能有几种有用的方式(取决于实现):

  • 您可以将相关代码保持在较近的位置,这样更易于阅读和理解
  • 内部函数可以直接访问外部函数的变量(因此,作为参数显式传递的内容更少)

  • 另外,在C/C++中定义函数是非标准的,只有一些编译器支持它。但是,你可以使用新的C++特性,即所谓的lambda函数。 在其他函数中定义函数(或lambda函数)可能有几种有用的方式(取决于实现):

  • 您可以将相关代码保持在较近的位置,这样更易于阅读和理解
  • 内部函数可以直接访问外部函数的变量(因此,作为参数显式传递的内容更少)

  • 在函数中声明函数没有什么价值,除非您打算稍后定义它,并且只让它对该函数可用——即,函数声明是封装的

    int main() {
        void foo();
        foo();
    }
    void some_other_func() {
        foo(); // ERROR
    }
    void foo() {
    }
    

    但就是这样。与触发最麻烦的解析相比,这充其量只是一个极其有限的好处。

    在函数中声明函数没有什么价值,除非您打算稍后定义它,并且只让它对该函数可用-即,函数声明是封装的

    int main() {
        void foo();
        foo();
    }
    void some_other_func() {
        foo(); // ERROR
    }
    void foo() {
    }
    


    但就是这样。与触发最复杂的解析相比,这是一个极其有限的好处。

    和C++的这一点!谢谢你举个例子。禁止在函数中声明函数并不能解决最棘手的解析问题;当您试图在命名空间范围内定义变量时,也会出现此问题。虽然在另一个函数中声明一个函数不是很有用,但似乎没有任何理由禁止它,并减少正交性。不过,如果在
    foo()
    实现之后实现了
    some\u other\u func()
    ,您将可以访问
    foo()
    ,因此,封装是相当虚假的。这是否意味着在另一个函数中声明函数没有实际用途?这是一件微妙的事情,我还需要其他人的意见。我想它有一个实际使用的Dimg。C++也可以!谢谢你举个例子。禁止在函数中声明函数并不能解决最棘手的解析问题;当您试图在命名空间范围内定义变量时,也会出现此问题。虽然在另一个函数中声明一个函数不是很有用,但似乎没有任何理由禁止它,并减少正交性。不过,如果在
    foo()
    实现之后实现了
    some\u other\u func()
    ,您将可以访问
    foo()
    ,因此,封装是相当虚假的。这是否意味着在另一个函数中声明函数没有实际用途?这是一件微妙的事情,我还需要其他人的意见。我想它有一个真正的用法。你确定“非标准”吗?问题是关于声明函数而不是定义它们。内部函数定义是非标准的(除非将C++11 lambda计算在内)。函数声明是标准的。@SteveJessop:谢谢你的澄清。我认为这是关于定义的,因为这是这里最有用的一个,因为人们(包括我自己)倾向于混合这两个术语,轮到我来混合它们了。:)@亚历克斯:事实上,每一个定义都是一个声明,这对混淆没有帮助。因此,当有人说“我在这里声明了这个函数”并且他们实际上已经定义了它时,他们没有错,混淆仍然存在……你确定“非标准”吗?问题是关于声明函数而不是定义它们。内部函数定义是非标准的(除非将C++11 lambda计算在内)。函数声明是标准的。@SteveJessop:谢谢你的澄清。我认为这是关于定义的,因为这是这里最有用的一个,因为人们(包括我自己)倾向于混合这两个术语,轮到我来混合它们了。:)@亚历克斯:事实上,每一个定义都是一个声明,这对混淆没有帮助。因此,当有人说“我在这里声明了这个函数”,而他们实际上已经定义了它,他们没有错,混淆仍然存在…@R.Martinho Fernandes谢谢,我也从这个问题中学到了东西。买的方式是不一样的问题。只有你提到的问题的标题与我的问题一致。但事实上,这些是不同的问题。对我来说似乎是同一个问题。就连你选择的答案也差不多。@R.Martinho Fernandes谢谢,我也从这个问题中学到了东西。买的方式是不一样的问题。只有你提到的问题的标题与我的问题一致。但事实上,这些是不同的问题。对我来说似乎是同一个问题。甚至你选择的答案也差不多。