Die Pascal with-Anweisung auch für c und c++?
-
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); }; }