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++方式)中来使该功能模块本地化.
当我想将它们作为参数传递给其他函数时,我需要 C 中的本地函数声明。我一直用其他语言这样做。原因是为了封装数据结构的实现。
例如,我定义了一些数据结构,例如树或图,并且我不想公开其内部实现的细节,例如因为我可能想要更改或改变它。因此,我公开了其元素的访问器和修改器函数,以及用于迭代元素的遍历函数。遍历函数的参数是一个对元素进行操作的函数;遍历函数的任务是对每个元素执行参数函数,并可能以某种方式聚合结果。现在,当我调用遍历函数时,参数函数通常是一些依赖于本地状态的特殊操作,因此应该定义为本地函数。必须将包含本地状态的变量的函数推入外部以使其成为全局变量,或者推入专门为保存它们而创建的内部类中,这是非常丑陋的。但这是我在使用 C 和 Java 时遇到的问题,而不是在使用 C++ 时遇到的问题。
| 归档时间: |
|
| 查看次数: |
12326 次 |
| 最近记录: |