Dreimal C++ – lambdas in legacy code

Wie schon zuletzt beschrieben, galt es C++ Software aus einem Nachbarprojekt zu übernehmen. Die dort tätigen Kollegen verwendeten begeistert die Features von C++ 2014. Vor allem der Datentyp „auto“ und die Initialisierung mit geschweiften Klammern hatte es ihnen angetan. Auch setzten sie shared_ptr und unique_ptr ein. Falls diese dann doch mit traditionellen Pointer darunter mischen, startet unter Umständen eine interessante Fehlersuche.

Aber mich interessierte die Art und Weise wie sie lambdas einbauten. Ich suchte nach eckigen Klammer gefolgt von einer geöffneten Klammer und konnte drei Sorten identifizieren:

  1. lokale Subroutinen (hätte man auch mit #defines machen können)
  2. Abräumer von von Windows handles (scope guard, geht kaum ohne lambdas)
  3. zur Initialisierung von static Variablen (das fand ich cool)

„Dreimal C++ – lambdas in legacy code“ weiterlesen

c++ im Jahr 2019: lambda und diskette

Was ich neulich im Job sah, warf mich förmlich um. Zum ersten Mal sah ich C++ lambda Ausdrücke in einem in die Jahre gekommen Softwarestapel. Es war sogar eine richtig praktische Anwendung, an die die Erfinder dieser neuen Sprachfeatures nicht gedacht hatten:


auto const fDoEvents = [&]()
     ProcessMessagesForCurrentProcessMainWindow();
     ProcessAfxMessagePump();
};
fDoEvents();

// vollen Refresh auslösen
xy->AddChanges(CTRL_NAV_RESULT);
z->Refresh(CTRL_NAV_CURR, true);
fDoEvents();

Das lambda fasste Statements zusammen, die in einem Spaghetticode immer wieder zu wiederholen sind. Hier war es immer mal wieder Messages zu bearbeiten. In der guten(?), alten Zeit hätten #define macros herhalten müssen.

In unmittelbarer Nähe, ein paar Zeilen unter dem zweiten Aufruf von fDoEvent()  befand sich ein Kommentar mit der Diskette:

// TODO: OFL aktualisieren (Dirtyflag / Diskette zurücksetzen)

Nach dem ersten Lachen stellte sich die Frage, wie dieser Kommentar in den Source kam.

Die Datei wurde laut tfs um 2015 geschrieben.

Die zweite Frage, war die, wie lambda Ausdrücke in den neuen C++ Standards funktioneren?

Das lud mich dann ein hierzu etwas zu schreiben.

„c++ im Jahr 2019: lambda und diskette“ weiterlesen