Die meisten C++ Programmierer wie ich haben folgende Fehler an einem gewissen Punkt gemacht:Gibt es irgendwelche Verwendung für lokale Funktionsdeklarationen?
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.
//...
}
Jetzt, während der Fehler ist ziemlich offensichtlich, wenn Sie es wissen, ich habe mich gefragt, ob es für diese Art von lokaler Funktionsdeklaration jede vernünftige Nutzung ist außer dass Sie es tun können - vor allem, da es keine Möglichkeit gibt eine solche lokale Funktion im selben Block zu definieren; Sie müssen es anderswo definieren.
Ich denke, dass lokale Java-Klassen eine ziemlich nette Funktion sind, die ich oft verwende, vor allem die anonyme Sortierung. Sogar lokale C++ - Klassen (die Inline-definierte Member-Funktionen haben können) haben einige Verwendung. Aber diese lokale Funktionserklärung ohne Definitionssache erscheint mir sehr peinlich. Ist es nur ein C-Vermächtnis oder gibt es einen tieferen Anwendungsfall, den ich nicht kenne?
bearbeiten für die Nichtgläubigen: C c()
ist nicht eine Funktion Zeigerdeklaration.
Dieses Programm
int main()
{
void g();
cout << "Hello ";
g();
return 0;
}
void g()
{
cout << "world." << endl;
}
Ausgänge Hello world.
Dieses Programm
void fun()
{
cout << "world." << endl;
}
int main()
{
void g();
g = fun;
cout << "Hello ";
g();
return 0;
}
nicht kompiliert. gcc klagt:
error: cannot convert 'void()()' to 'void()()' in assignment
comeau:
error: expression must be a modifiable lvalue
Beachten Sie, dass die GCC-Fehlermeldung falsch ist (bekannter Fehler). Es sollte "error: convert 'void()' in 'void()' in assignment" nicht konvertiert werden, aber es wird die Type-ID falsch abgefragt. (anstelle von "void()()", was eine Funktion wäre, die eine Funktion zurückgibt (illegaler Typ), sollte sie "void()" sagen –
verwandte Frage: http://stackoverflow.com/questions/928992/nested -funktionen-sind-nicht-erlaubt-aber-warum-geschachtelt-funktion-prototypen-sind erlaubt –
Ich bin mir nicht sicher, ob die gcc-Fehlermeldung ein Fehler ist - Sie können die Funktion sogar mit einem zusätzlichen Klammerpaar deklarieren ' void (g)() ', die Sie brauchen, wenn Sie mit Funktionszeigern umgehen:' void * g() 'ist eine Funktion, die ein' void * 'zurückgibt, während' void (* g)() 'ein Zeiger auf eine Funktion ist vom Typ, nun, 'void()()', dh keine Argumente zu nehmen und nichts zurückzugeben. – Tobias