Die Pascal with-Anweisung auch für c und c++?



  • Hallo Leute!

    In Pascal gibt es die with-Anweisung, um dort record-Gesamtnamen einzusparen.
    Gibt es eine ähnliche Anweisung in c/c++, welche zum Beispiel bei
    Strukturvariablen den Gesamtnamen abkürzen könnte?
    Beispiel:

    struct _dreieck
    {
     long double a, aq, att, b, bq, qt, h, ht, hq, c, p, pq, q, laufende;
    } triangle;
    

    Aufruf mit:

    triangle.hq = triangle.p * triangle.q;
    triangle.h = sqrtl(triangle.hq);
    triangle.aq = triangle.hq + (triangle.p * triangle.p);
    triangle.att = sqrtl(triangle.aq);
    

    So das mit der (gewünschten) Anweisung verkürzt werden könnte, damit man
    sich keinen Wolf tippt.
    etwa so:

    with triangle
    {
    hq = p * q;
    h = sqrtl(hq);
    aq = hq + (p * p);
    att = sqrtl(aq);
    }
    

    Ich arbeite mit gcc und Linux mit codeblocks 16.01.



  • Nein gibt es nicht.



  • Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C (alle ISO-Standards) in das Forum C++ (alle ISO-Standards) verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.


  • Mod

    rustyoldguy schrieb:

    c/c++

    Diese Sprache gibt es nicht. C und C++ sind zwei ganz unterschiedliche Sprachen.

    Aber auch in C++ ist die Antwort: Nein, gibt es nicht. Dazu sind Klassenmethoden da. Unter Schmerzen kann man sich vielleicht sogar was zurecht hacken, das einen ähnlichen Effekt hätte. Ist aber nicht empfehlenswert.

    Diese Frage hätte man übrigens wunderbar googeln können. Es gibt Dutzende treffende Antworten.


  • Mod

    SeppJ schrieb:

    Dazu sind Klassenmethoden da.

    👍


  • Mod

    PS: Da Googeln nicht so Jedermanns Sache ist, hier ein "schöner" Hack, den jemand auf Stackoverflow vorgeschlagen hat:
    http://stackoverflow.com/questions/2279180/does-c-have-with-keyword-like-pascal/2279253#2279253



  • Wenn man nach soetwas googelt, mag man die Antwort nicht immer gleich glauben 😉 Es kann durchaus sein, dass es halbwegs sinnvolle Antworten gibt, die man erst nach einer Weile findet (ok, jetzt nicht unbedingt zu dem Thema).
    Ich hab früher Delphi programmiert und es hat mich auch interessiert, als ich auf C++ umgestiegen bin. Aber eigentlich ist es keine gute Idee, Tipparbeit sparen zu wollen und ich hab das Feature nie vermisst.



  • Denkst du etwas das sind alle Trolle? 😃


  • Mod

    Stackoverflow ist wegen seiner Selbstregulierung doch relativ zuverlässig, was die Qualität der Antworten angeht.

    ~Jetzt darf jeder mal das krasseste Gegenbeispiel zum besten geben, wo eine gute Antwort niedergemacht wurde oder, noch viel schlimmer, wo die eigene Antwort niedergemacht wurde.~



  • Hallo roflo!

    Da ich einige schwere Hand-Verletzungen durch Arbeitsunfälle als
    Metallarbeiter hatte, wäre für mich eine solche Anweisung in c
    wünschenswert, nicht nur WITH.

    Pascal scheint seit einiger Zeit "out" zu sein.
    Pascal hatte aber Vorteile, beispielsweise bei der Portierung von Code.
    Der ist anscheinend bei c/c++ schwerer zu portieren als Pascal,
    je nach Compiler-Hersteller. Ebenso hat Pascal oberhalb der
    Funktionsebene Assemblerniveau. Oft ist es auch in C nicht möglich
    einen String als WERT zu erhalten oder zurückzugeben.
    Dazu kommen die Unterschiede bei der Typ-Prüfung der Parameter und deren
    Übergabe bei C (von rechts nach links auf den Stack) und bei Pascal(ist es umgekehrt, von links nach rechts).
    Ob dies dann besser ist, da Pascal den Stackpointer selber vor
    dem Rücksprung zum Code zurücksetzen muss, bleibt Glaubenssache.
    Die Unterschiede bei den Variablentypen finde ich, sind ganz okay.
    Viele Sachen sind bei c und c++ in den letzten Jahren besser geworden
    und lassen sich mit Schlüsselwörtern und Einstellungen "ausmerzen".


  • Mod

    Not sure if trolling...



  • rustyoldguy schrieb:

    Viele Sachen sind bei c und c++ in den letzten Jahren besser geworden
    und lassen sich mit Schlüsselwörtern und Einstellungen "ausmerzen".

    #define BEGIN {
    #define END }
    

    Und es gibt keinen Smiley, der meine Gefühle dazu ausdrückt.




  • Mod

    SeppJ schrieb:

    PS: Da Googeln nicht so Jedermanns Sache ist, hier ein "schöner" Hack, den jemand auf Stackoverflow vorgeschlagen hat:
    http://stackoverflow.com/questions/2279180/does-c-have-with-keyword-like-pascal/2279253#2279253

    Der Hack ist nur leider fast nutzlos, da

    • nur auf einer Kopie des Objekts agiert wird,
    • lokale Variablen nicht verwendet werden können.

    Ist sozusagen nur ein PoC für die Syntax. Könnte deutlich interessanter werden, sobald Aliasing entsprechend angepasst wird ([basic.lval]/(10.6) könnte erweitert werden).



  • SeppJ schrieb:

    Dazu sind Klassenmethoden da.

    so isses:

    struct _dreieck
    {
     long double a, aq, att, b, bq, qt, h, ht, hq, c, p, pq, q, laufende;
     void update();
    } triangle;
    
    void _dreieck::update()
    {
        hq = p * q;
        h = sqrtl(hq);
        aq = hq + (p * p);
        att = sqrtl(aq);
    }
    // und später dann
        triangle.update();
    

    im Übrigen kannst Du einiges an Tipparbeit sparen, indem Du einige Variablen einfach weg lässt. Ich vermute, dass Du nicht alle benötigst, dazu müsste man aber das Problem besser kennen.
    Was ist z.B. der Unterschied zwischen att und a ?

    Gruß
    Werner



  • rustyoldguy schrieb:

    In Pascal gibt es die with-Anweisung, um dort record-Gesamtnamen einzusparen.

    Die ist übrigens in modernen Pascal-Dialekten zu Recht verpönt.


  • Mod

    Also, wenn es tatsächlich bitter nötig zu sein scheint, ließe sich durchaus etwas basteln:

    #include <boost/preprocessor/seq/enum.hpp>
    #include <boost/preprocessor/seq/for_each.hpp>
    #include <boost/preprocessor/tuple/to_seq.hpp>
    
    #define WITH_DECLARATION(r, data, elem) \
    	if (bool _loop_cond = false); else for (auto& elem = data.elem; !_loop_cond; _loop_cond = true)
    #define WITH(d, ...) BOOST_PP_SEQ_FOR_EACH(WITH_DECLARATION, d, BOOST_PP_TUPLE_TO_SEQ((__VA_ARGS__)))
    
    //! TEST
    
    #include <iostream>
    #include <cmath>
    
    #define DREIECK_MEMBERS a, aq, att, b, bq, qt, h, ht, hq, c, p, pq, q, laufende
    struct dreieck {
    	long double DREIECK_MEMBERS;
    } triangle;
    #define WITH_DREIECK(t) WITH(t, DREIECK_MEMBERS)
    
    int main() {
    	WITH_DREIECK(triangle) {
    		hq = p * q;
    		h = sqrtl(hq);
    		aq = hq + (p * p);
    		att = sqrtl(aq);
    	};
    }
    

Anmelden zum Antworten