Thomas Woelfers Baustatik Blog

Baustatik-Software und was sonst des Weges kommt

Keine Macros in C#

Vor ein paar Tagen gab es eine kurze Diskussion über Features, die man in C# gerne sehen würden. Abgesehen von Templates, die es in Form von Generics ja bald geben wird, vermisse ich Macros am meisten. Eric Gunnerson hat hier eine kurze Begründung dafür, warum es keine gibt. (Wow - Eric liest meine Kommentare! :-) )

Anschliessen kann ich mich dem aber nicht: Es gibt immer Möglichkeiten ein Tool zu mißbrauchen, und nur weil es Programmierer gibt die mit Macros verantwortungslos umgehen, bedeutet das meiner Ansicht nach nicht, das man sie aus dem Sprachumfang heraushalten sollte.

Naja - egal: Es gibt halt keine, und dabei wirds wohl auch bleiben.

Comments (1) -

  • phresnel

    5/4/2009 11:01:33 AM |

    Aber Generics sind keine Templates. Die drei Hauptunterschiede in meinen Augen:

    0) Generics in C# können nur von Typ-Parametern abhängen, Templates darüberhinaus auch von Wert-Parametern.

    1) Templates können explizit spezialisiert und partiell spezialisiert werden; in Kombination mit 0) erlaubt das eine turing-vollständige Meta-Programmierung. Thierry Berger-Perrin (http://ompf.org , http://ompf.org/forum/) hat gar eine IEEE-konforme Floating-Point-Library und darauf aufbauend einen Compile-Time-Raytracer geschrieben (http://ompf.org/stuff/metafloat/ , www.reddit.com/.../)

    2) Templates werden "lazy" instantiiert, Generics aber "eager", d.h. bei Generics müssen alle Abhängigkeiten (bspw.: "T sei ein Typ; gibt es eine Funktion f(T) für alle T?", "gibt es für jedes T einen Operator+?") erfüllt sein; bei Templates hingegen werden nur die tatsächlich verwendeten Template-Funktionen/-Klassen instantiiert (es sei denn, das Template wird explizit instantiiert), d.h. folgender Code ist gültiges C++:

    template <typename T> struct X {
            void foo () {
                    T a, b;
                    a += b ^ a;
                    a.foo().bar().baz().yay()->a;
            }
    };
    int main () {
            X<int> ix;
    }


    Es gibt noch viele weitere Unterschiede, die Microsoft selbst auch gar nicht bestreitet. Aber ich mache mal Schluss bevor ich zu weit ausschweife Laughing

    Viele Grüße

    P.S.: Das Kommentar-Formular akzeptiert keine Angle-Brackets :/

Comments are closed