Ich habe ein bisschen C geschrieben und kann es gut genug lesen, um eine allgemeine Vorstellung davon zu bekommen, was es tut, aber jedes Mal, wenn ich auf ein Makro gestoßen bin, hat es mich völlig geworfen. Am Ende muss ich mich daran erinnern, was das Makro ist, und es beim Lesen in meinem Kopf ersetzen. Diejenigen, denen ich begegnet bin, die intuitiv und leicht zu verstehen waren, waren immer wie kleine Minifunktionen, deshalb habe ich mich immer gefragt, warum sie nicht nur Funktionen waren.
Ich kann die Notwendigkeit verstehen, verschiedene Build-Typen für Debug- oder plattformübergreifende Builds im Präprozessor zu definieren, aber die Fähigkeit, beliebige Substitutionen zu definieren, scheint nur nützlich zu sein, um eine bereits schwierige Sprache noch schwieriger zu verstehen.
Warum wurde ein so komplexer Präprozessor für C eingeführt? Und hat jemand ein Beispiel für die Verwendung, das mir verständlich macht, warum es immer noch für andere Zwecke als einfache, wenn auch bedingte Kompilierungen im # debug-Stil verwendet wird?
Bearbeiten:
Nachdem ich einige Antworten gelesen habe, verstehe ich es immer noch nicht. Die häufigste Antwort ist Inline-Code. Wenn das Inline-Schlüsselwort dies nicht tut, hat es entweder einen guten Grund, dies nicht zu tun, oder die Implementierung muss korrigiert werden. Ich verstehe nicht, warum ein ganz anderer Mechanismus benötigt wird, der "diesen Code wirklich inline" bedeutet (abgesehen von dem Code, der geschrieben wurde, bevor es Inline gab). Ich verstehe auch nicht die Idee, die erwähnt wurde, dass "wenn es zu dumm ist, um in eine Funktion gesetzt zu werden". Sicherlich wird jeder Code, der eine Eingabe nimmt und eine Ausgabe erzeugt, am besten in eine Funktion eingefügt. Ich glaube, ich bekomme es vielleicht nicht, weil ich nicht an die Mikrooptimierungen beim Schreiben von C gewöhnt bin, aber der Präprozessor fühlt sich einfach wie eine komplexe Lösung für ein paar einfache Probleme an.