本地函数声明有用吗?

Tob*_*ias 19 c++ function local definition

像我这样的大多数C++程序员在某些方面犯了以下错误:

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.

  //...
}
Run Code Online (Sandbox Code Playgroud)

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

我认为Java风格的本地类是一个非常好的功能,我倾向于经常使用,特别是匿名排序.甚至本地C++类(可以具有内联定义的成员函数)也有一些用处.但是这个没有定义的本地函数声明对我来说似乎很尴尬.它只是一个C-legacy还是有一些我不知道的更深层次的用例?

编辑对于非信徒:C c()不是一个函数指针声明.

这个计划

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

void g()
{
  cout << "world." << endl;
}
Run Code Online (Sandbox Code Playgroud)

输出Hello world.这个程序

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

int main()
{
  void g();
  g = fun;
  cout << "Hello ";
  g();
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

不编译.gcc抱怨:

error: cannot convert 'void ()()' to 'void ()()' in assignment

科莫:

error: expression must be a modifiable lvalue

Ada*_*eld 11

我能想到的唯一用途是减少函数声明的范围:

int main()
{
    void doSomething();
    doSomething();
    return 0;
}

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

void doSomething()
{
    ...
}
Run Code Online (Sandbox Code Playgroud)

当然,还有更好的解决方案.如果需要隐藏一个函数,则应该通过将函数移动到单独的模块中来重构代码,以便需要调用要隐藏的函数的函数都在同一个模块中.然后,您可以通过将其声明为静态(C方式)或将其置于匿名命名空间(C++方式)中来使该功能模块本地化.


rei*_*ost 2

当我想将它们作为参数传递给其他函数时,我需要 C 中的本地函数声明。我一直用其他语言这样做。原因是为了封装数据结构的实现。

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

  • 示例代码会很好:) 例如,如果本地函数声明非法,我必须这样做,这里它使用本地声明。 (2认同)