![]() |
玩滑板的移动电源 · 尽管使用了fpic,但出现错误“在创建共享对 ...· 1 年前 · |
![]() |
豪情万千的饭盒 · CSS之pointer-events优雅处理 ...· 2 年前 · |
![]() |
痴情的啄木鸟 · 使用 Preload&Prefetch ...· 2 年前 · |
以下错误:
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遗产,还是有一些我不知道的更深层的用例?
这个程序
int main()
void g();
cout << "Hello ";
return 0;
void g()
cout << "world." << endl;
}
输出
Hello world.
这个程序
void fun()
cout << "world." << endl;
int main()
void g();
g = fun;
cout << "Hello ";
return 0;
}
不编译. gcc:
error: cannot convert 'void ()()' to 'void ()()' in assignment
comeau:
error: expression must be a modifiable lvalue
当我想将它们作为参数传递给其他函数时,我想在C中使用局部函数声明。我一直在用其他语言来做这件事。原因是封装了数据结构的实现。
例如。我定义了一些数据结构,例如树或图表,我不想公开其内部实现的细节,例如因为我可能想改变或改变它。所以我公开了它的元素的访问器和增变函数,以及遍历元素的遍历函数。遍历函数的参数是一个函数,它对元素进行操作;遍历函数的任务是在每个元素上执行参数函数,并可能以某种方式汇总结果。现在,当我调用遍历函数时,参数函数通常是一些依赖于本地状态的特定操作,因此应该定义为本地函数。必须将包含本地状态,外部变量为全局变量的函数或专门为保持它们而创建的内部类推入该函数中,这很难理解。但这是我用C和Java所遇到的问题,而不是用C ++。
缩小函数声明的范围:
int main()
void doSomething();
doSomething();
return 0;
void otherFunc()
doSomething(); // ERROR, doSomething() not in scope
void doSomething()
}
这是一个前向声明原型。 可以想象,如果你有很多本地功能,或者与定义顺序相反的局部功能,你可能需要它。
我能看到的唯一的理智用法是只允许编译单元中的一个函数知道另一个编译单元中定义的函数。 我认为这是一个合理的使用方式,但这是我能想到的唯一一个,我认为这是过度的。
#include <stdio.h>
void c(); // Prototype of a function named ``c''
int main() {
c(); // call the function
{ // additional scoppe needed for C, not for C++
int c = 0; // shadow the c function with a c integer variable
void c(); // hide the c integer variable back with the c function
} //!
return 0;
void c() {
printf("Called\n");
}
我有时会这样做,出于同样的原因,鼓励我们在第一次使用之前(而不是早期)声明变量,即提高可读性。 (是的,我意识到变量更重要,因为它减轻了你需要检查变量是否在你认为是它的第一次使用之前被使用)。 具有原型(特别是如果它比
c()
更接近于函数调用)会提高可读性。 特殊情况
C c()
误导人类的事实是不幸的,但在本地宣布职能的总体思路是有价值的。
当然,对于已经在范围内的函数名也是如此。 为什么不在每次使用之前重新声明每个函数? 我的回答是:适度地做所有事情。 过多的混乱妨碍了可读性(以及可维护性---如果函数的签名不断变化)。 因此,虽然我不会排除它,但在本地声明函数有时很有用。
如果要声明不接受参数的函数和使用默认析构函数实例化类,请跳过括号。
class C
public:
void foo() {}
int main()
// declare function d, taking no arguments, returning fresh C
C d();
// instantiate class (leave parenthesis out)
c.foo();
// call declared function
C goo = d();
return 0;