首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >本地函数声明有什么用处吗?

本地函数声明有什么用处吗?
EN

Stack Overflow用户
提问于 2018-03-12 06:54:07
回答 7查看 0关注 0票数 0

以下错误:

代码语言:javascript
复制
class C { /*...*/ };

int main() {
  C c();     // declares a function c taking no arguments returning a C,
             // not, as intended by most, an object c of type C initialized
             // using the default constructor.
  c.foo();   // compiler complains here.

  //...
}

现在虽然错误很明显,但一旦你知道它,我想知道是否有任何明智的用途用于这种局部函数声明,除非你可以这样做 - 特别是因为没有办法在同一个函数中定义这样的局部函数 块; 你必须在其他地方定义它。

我认为Java风格的本地类是我经常使用的一个非常不错的功能,尤其是匿名排序。 即使是本地C ++类(可以有内联定义的成员函数)也有一定用处。 但是这个没有定义的本地函数声明对我来说似乎非常尴尬。 它只是一个C遗产,还是有一些我不知道的更深层的用例?

这个程序

代码语言:javascript
复制
int main()
{
  void g();
  cout << "Hello ";
  g();
  return 0;
}

void g()
{
  cout << "world." << endl;
}

输出Hello world.这个程序

代码语言:javascript
复制
void fun()
{
  cout << "world." << endl;
}

int main()
{
  void g();
  g = fun;
  cout << "Hello ";
  g();
  return 0;
}

不编译. gcc:

代码语言:javascript
复制
error: cannot convert 'void ()()' to 'void ()()' in assignment

comeau:

代码语言:javascript
复制
error: expression must be a modifiable lvalue
EN

回答 7

Stack Overflow用户

发布于 2018-03-12 09:55:12

当我想将它们作为参数传递给其他函数时,我想在C中使用局部函数声明。我一直在用其他语言来做这件事。原因是封装了数据结构的实现。

例如。我定义了一些数据结构,例如树或图表,我不想公开其内部实现的细节,例如因为我可能想改变或改变它。所以我公开了它的元素的访问器和增变函数,以及遍历元素的遍历函数。遍历函数的参数是一个函数,它对元素进行操作;遍历函数的任务是在每个元素上执行参数函数,并可能以某种方式汇总结果。现在,当我调用遍历函数时,参数函数通常是一些依赖于本地状态的特定操作,因此应该定义为本地函数。必须将包含本地状态,外部变量为全局变量的函数或专门为保持它们而创建的内部类推入该函数中,这很难理解。但这是我用C和Java所遇到的问题,而不是用C ++。

票数 0
EN

Stack Overflow用户

发布于 2018-03-12 11:29:01

缩小函数声明的范围:

代码语言:javascript
复制
int main()
{
    void doSomething();
    doSomething();
    return 0;
}

void otherFunc()
{
    doSomething();  // ERROR, doSomething() not in scope
}

void doSomething()
{
    ...
}
票数 0
EN

Stack Overflow用户

发布于 2018-03-12 12:53:38

这是一个前向声明原型。 可以想象,如果你有很多本地功能,或者与定义顺序相反的局部功能,你可能需要它。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/-100007591

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档