12 Stimmen

Ist es möglich in C oder C++, eine Funktion innerhalb einer anderen Funktion zu erstellen?

Könnte mir jemand bitte sagen, ob dies in C oder C++ möglich ist?

void fun_a();
//int fun_b();
...
main(){
   ...
   fun_a();
   ...
   int fun_b(){
     ...
   }
   ...
} 

oder etwas Ähnliches, wie z.B. eine Klasse innerhalb einer Funktion?

Vielen Dank für eure Antworten,

30voto

Potatoswatter Punkte 130562

Wow, ich bin überrascht, dass noch niemand Ja gesagt hat! Kostenlose Funktionen können nicht geschachtelt werden, aber Funktoren und Klassen im Allgemeinen können.

void fun_a();
//int fun_b();
...
main(){
   ...
   fun_a();
   ...
   struct { int operator()() {
     ...
   } } fun_b;

   int q = fun_b();
   ...
}

Sie können dem Funktor einen Konstruktor geben und Verweise auf lokale Variablen übergeben, um ihn mit dem lokalen Bereich zu verbinden. Andernfalls kann er auf andere lokale Typen und statische Variablen zugreifen. Lokale Klassen können jedoch keine Argumente für Vorlagen sein.

7voto

Xorlev Punkte 8393

C++ unterstützt keine verschachtelten Funktionen, aber Sie können etwas wie boost::lambda verwenden.

6voto

kennytm Punkte 488916

C — Ja für gcc als Erweiterung.

C++ — Nein.

5voto

Rick Punkte 3215

Sie können in C++ keine Funktion innerhalb einer anderen Funktion erstellen.

Sie können jedoch einen lokalen Klassenfunktor erstellen:

int foo()
{
   class bar
   {
   public:
      int operator()()
      {
         return 42;
      }
   };
   bar b;
   return b();
}

In C++0x können Sie einen Lambda-Ausdruck erstellen:

int foo()
{
   auto bar = []()->int{return 42;};
   return bar();
}

5voto

Nein, aber in C++0x können Sie es http://en.wikipedia.org/wiki/C%2B%2B0x#Lambda_functions_and_expressions tun, was möglicherweise noch einige Jahre dauern wird, um vollständig unterstützt zu werden. Der Standard ist zum Zeitpunkt dieses Schreibens noch nicht abgeschlossen.

-edit-

Ja

Wenn Sie MSVC 2010 verwenden können. Ich habe den folgenden Code erfolgreich ausgeführt

void test()
{
 []() { cout << "Hallo Funktion\n"; }();
 auto fn = [](int x) -> int { cout << "Hallo Funktion (" << x << " :))\n"; return x+1; };
 auto v = fn(2);
 fn(v);
}

Ausgabe

Hallo Funktion
Hallo Funktion (2 :))
Hallo Funktion (3 :))

(Ich habe >> c:\dev\loc\uniqueName.txt im Abschnitt der Arbeitsargumente des Projekts geschrieben und dieses Ergebnis kopiert und eingefügt)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X