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.
-
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.
-
SeppJ schrieb:
Dazu sind Klassenmethoden da.
-
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?
-
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".
-
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.
-
-
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#2279253Der 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 zwischenatt
unda
?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.
-
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); }; }