Forum: Compiler & IDEs Linux ist endlich vom C89 Standard weg


von Stefan F. (Gast)


Lesenswert?

Stattdessen wird nun auch C11 gesetzt.

Vielleicht schaffen die letzten Mikrocontroller Mohikaner hier auch noch 
den Wechsel. Wäre schön. Denn Sätze wie "das ist kein richtiges C, weil 
kein C89" nerven mich nur noch.

Siehe 
https://www.heise.de/news/Linux-5-18-kommt-als-kleine-Revolution-7121451.html

von Rolf M. (rmagnus)


Lesenswert?

Stimmt eigentlich nicht. Weder war es vorher C89, noch ist es jetzt C11, 
denn der Kernel hat schon immer sehr rege zahlreiche GNU-Erweiterungen 
genutzt. Das ist der Grund, weshalb es ein riesiger Aufwand ist, den 
Kernel mit was anderem als GCC übersetzt zu bekommen.

von linux fährt gegen die wand (Gast)


Lesenswert?

also die Hardware-Kastration zu ermöglichen, ist schon starker Tobak.

Anscheinend ist für Linus und Co. die Idee von open source einfach nur 
quelloffene Projektdateien - und nichts mehr. Die Geeks kann man damit 
verjagen und neue Kunden kommen so auch keine dazu.

Überhaupt gibt es unter Linux immer mehr Sachen, die fraglich sind.

von Georg A. (georga)


Lesenswert?

linux fährt gegen die wand schrieb:
> also die Hardware-Kastration zu ermöglichen, ist schon starker Tobak.

Naja, ob das mit dem Enablen von Features jetzt zB. nur übers Bios 
möglich ist oder auch im Kernel ist eigentlich recht egal.

von Rolf M. (rmagnus)


Lesenswert?

linux fährt gegen die wand schrieb:
> also die Hardware-Kastration zu ermöglichen, ist schon starker Tobak.

Naja, ohne das "Feature" ist die Hardware auch kastriert.

> Anscheinend ist für Linus und Co. die Idee von open source einfach nur
> quelloffene Projektdateien - und nichts mehr. Die Geeks kann man damit
> verjagen und neue Kunden kommen so auch keine dazu.

Was sollten sie denn tun? Wenn sie es nicht einbauen, ist Linux halt das 
System, das den kompletten Funktionsumfang eines Intel-Prozessors nicht 
nutzen kann. Auf die Weise kommen mit Sicherheit auch keine Kunden dazu.

> Überhaupt gibt es unter Linux immer mehr Sachen, die fraglich sind.

Es geht halt heute kaum anders.

von Oliver S. (oliverso)


Lesenswert?

linux fährt gegen die wand schrieb:
> also die Hardware-Kastration zu ermöglichen, ist schon starker Tobak.

Die ermöglichen keine Hardware-Kastration, sondern genau das Gegenteil: 
das freischalten von zusätzlichen Funktionen.  Das Intel-Konzept wird 
dadurch zwar nicht besser, aber ob ignorieren dagegen hilft, ist doch 
sehr fraglich.

linux fährt gegen die wand schrieb:
> Anscheinend ist für Linus und Co. die Idee von open source einfach nur
> quelloffene Projektdateien - und nichts mehr. Die Geeks kann man damit
> verjagen und neue Kunden kommen so auch keine dazu.

Geeks sind für Linux schon lange keine Zielgruppe mehr. Und das ist auch 
gut so.

Oliver

von Geradlinig in alle Richtungen (Gast)


Lesenswert?

Stefan ⛄ F. schrieb:
> Vielleicht schaffen die letzten Mikrocontroller Mohikaner hier auch noch
> den Wechsel.

Nö, verschiedene Welten verschiedenen Programmiersprachen.
Ist doch gut so. Warum soll die ganze Welt Chinesisch sprechen nur weil 
die derzeit grösste Tageszeitung in Mandarin gedruckt wird.

Und weder die Guangzhou Daily noch Linux ist der Nabel der Welt.

von Bauform B. (bauformb)


Lesenswert?

Geradlinig in alle Richtungen schrieb:
> Stefan ⛄ F. schrieb:
>> Vielleicht schaffen die letzten Mikrocontroller Mohikaner hier auch noch
>> den Wechsel.
>
> Nö, verschiedene Welten verschiedenen Programmiersprachen.
> Ist doch gut so.

Aber völlig unverständlich! Sonst muss es doch immer die neueste Version 
einer Software sein und jedes Update wird mitgemacht. Bei C würde es 
sich auf jeden Fall lohnen, was wäre bei C11 schlechter als bei C89? Wer 
nicht gerade Millionen Zeilen Code umstellen muss, wechselt natürlich 
gleich zu C17 oder sogar C2x.

Was spricht in diesem Fall für total veraltetes Werkzeug?

Bei Bauteilen staune ich auch immer wieder, dass hier bevorzugt die 
ältesten Chips eingesetzt werden. Na gut, dafür gibt's seit 1 bis 2 
Jahren immerhin ein Argument. Aber Compiler sind lieferbar.

von 🐧 DPA 🐧 (Gast)


Lesenswert?

Bei Chips ist noch das Problem, dass man die längerfristig braucht. Da 
will man dann nicht, das man mit allem Fertig wäre, und dann gibts den 
Chip schon nicht mehr, man soll den neueren nehmen. Ein 5 Jahre alter 
Chip gibt es noch weitere 5 Jahre oder so. Der neue Chip von Gestern ist 
vieleicht schon nächsten Monat wieder obsolete...

von Bauform B. (bauformb)


Lesenswert?

linux fährt gegen die wand schrieb:
> also die Hardware-Kastration zu ermöglichen, ist schon starker Tobak.

Einigen wir uns drauf, dass du das ganz falsch verstanden hast. Außerdem 
ist diese Geschäftsidee doch bei Messgeräten bewährt und akzeptiert, 
wenn nicht sogar beliebt, oder?

Und dann wieder: gut für AMD, falls die Leute das wirklich ernsthaft 
nicht mögen.

von Oliver S. (oliverso)


Lesenswert?

Bauform B. schrieb:
> Bei C würde es
> sich auf jeden Fall lohnen, was wäre bei C11 schlechter als bei C89?

Steht alles in den entsprechenden Meldungen, z.B. bei heise:

Ein neuer Sprachstandard bedeutet anscheinend die Nutzung eines neuen 
Parsers beim gcc.

Mit allen Risiken und Nebenwirkungen, die das bei einem auf außerhalb 
des Standards liegenden gcc-Erweiterungen angewiesenen, nicht ganz 
kleinen Stückchen Software halt so mit sich bringt.

Oliver

von 🐧 DPA 🐧 (Gast)


Lesenswert?

Freischalten von Funktionen von HW, die einem bereits gehört. 
Proprietäre Firmware. Signieren von Firmware, ohne dem Nutzer eine 
Möglichkeit zu geben, seien eigene Firmware mit einem eigenen Key zu 
signieren. Das gehört alles verboten!

Im Endeffekt sind all diese Modelle rein nur dazu da, den Gewinn zu 
maximieren, ohne einen Mehrwert zu bringen. Die Hardware - die man ja 
schon gekauft hat - hat das ja alles schon verbaut, das Deaktivieren der 
Features macht die HW nicht billiger herzustellen. Somit könnte die 
ganze HW massiv günstiger verkauft werden!

Pakete, Produkte als Service, etc. Das sind alles Abzockmethoden, um 
mehr Geld zu machen, ohne dass der Verbraucher etwas davon hat. Statt 
gute Produkte zwingt man den Kunden schlechtere Angebote anzunehmen, 
weil es halt nicht anders geht.

Der Zweck des freien Marktes / Kapitalismus ist es, dass Konkurrenz dazu 
führt, das Unternehmen, bessere, billigere/mehr, oder sich sonst wie 
abhebende Produkte macht, und wir so alle von mehr, billigeren & 
besseren Produkten Profitieren. All diese Methoden der Unternehmen 
anderweitig ihren Gewinn zu maximieren, sollten verboten werden! Das ist 
ja auch die Idee hinter Antitrust/Kartellrecht, nur ist das leider in 
der Zeit vor der Technologierevolution stehengeblieben!

Und Limitationen durch Software sind nochmal eine Nummer gefährlicher. 
Da kann man nämlich nichts dagegen machen. Es ist quasi ein paralleles 
Rechtssystem. Einen Safe kann ich aufbrechen. Verbote kann ich 
ignorieren. Und Gesetze sind auch nicht dazu da, einem das Leben schwer 
zu machen, sondern werden anhand der Situation und Intention ausgelegt - 
theoretisch dem Willen des Folkes folgend. Aber künstliche 
Softwarerestriktionen sind anders. Sie werden vom Hersteller Diktiert, 
können nicht umgangen werden, und orientieren sich ausschliesslich an 
den Eigeninteressen des Unternehmens, statt an den Interessen des 
Volkes. Sozusagen eine Diktatur durch die Technologie-Hintertür!

Es besteht dringender Handlungsbedarf. Da darf nicht einfach weiter 
zugesehen werden, die Technologiediktatur & Bevormundung muss gestoppt 
werden! Es muss jetzt endlich mal gehandelt werden! Das Kartellrecht 
braucht Weltweit ein saftiges Update.

von Oliver S. (oliverso)


Lesenswert?

🐧 DPA 🐧 schrieb:
> Sie werden vom Hersteller Diktiert,
> können nicht umgangen werden, und orientieren sich ausschliesslich an
> den Eigeninteressen des Unternehmens, statt an den Interessen des
> Volkes.

Rotfl ;)

Oliver

von DPA (Gast)


Lesenswert?

Ja ja, noch ist das lustig. Aber es kann nichts gutes daraus folgen, 
eine kaputte fitness funktion nicht zu fixen. Sobald du für deinen 
Toaster ein Abo brauchst, verstehst du es vielleicht.

von Oliver S. (oliverso)


Lesenswert?

DPA schrieb:
> Sobald du für deinen
> Toaster ein Abo brauchst, verstehst du es vielleicht.

Kein Sorge, ich werde keinen Toaster mit Abo bekommen. Und das wird 
daran liegen, daß ich grundsätzlich und immer nur einen ohne kaufen 
werde.

Ohne jetzt große Diskussionen über "das Volk" los zu brechen, hat dieses 
nämlich immer noch die einfache, aber wirkungsvolle Macht, irgend einen 
Schxxx schlicht nicht zu kaufen. Und selbst das kapitalistischste 
Unternehmen kann daran nichts ändern. Gerade solche Unternehmen wissen 
das aber auch ganz genau.

Oliver

von DPA (Gast)


Lesenswert?

Oliver S. schrieb:
> hat dieses nämlich immer noch die einfache, aber wirkungsvolle Macht,
> irgend einen Schxxx schlicht nicht zu kaufen.

Das setzt immer voraus, dass es entweder Alternativen gibt, oder man 
darauf verzichten kann. Bei einem Toaster ist das (noch) so. Bei vielen 
anderen Dingen aber schon nicht mehr.

von Stefan F. (Gast)


Lesenswert?

linux fährt gegen die wand schrieb:
> Überhaupt gibt es unter Linux immer mehr Sachen, die fraglich sind.

Je bunter die Anwendungsfälle, umso mehr Leuten missfallen einzelne 
Farben. Damit muss man wohl leben - solange man kein eigenes OS 
entwickelt.

von Stefan F. (Gast)


Lesenswert?

Geradlinig in alle Richtungen schrieb:
> Warum soll die ganze Welt Chinesisch sprechen nur weil
> die derzeit grösste Tageszeitung in Mandarin gedruckt wird.

Es würde einiges vereinfachen. Doch nachdem Esperanto schon ein 
Rohrkreppierer war würde ich es in diesem Leben nicht nochmal versuchen.

von linux fährt gegen die wand (Gast)


Lesenswert?

Stefan ⛄ F. schrieb:
> Stattdessen wird nun auch C11 gesetzt

Warum eigentlich nicht gleich zu C17? Das sind doch eh nur bug fixes und 
kleine Ergänzungen.

von udok (Gast)


Lesenswert?

Bauform B. schrieb:
> Aber völlig unverständlich! Sonst muss es doch immer die neueste Version
> einer Software sein und jedes Update wird mitgemacht. Bei C würde es
> sich auf jeden Fall lohnen, was wäre bei C11 schlechter als bei C89? Wer
> nicht gerade Millionen Zeilen Code umstellen muss, wechselt natürlich
> gleich zu C17 oder sogar C2x.
>
> Was spricht in diesem Fall für total veraltetes Werkzeug?

- Die neuen Tools sind deutlich langsamer.

- Die Programmierer haben sich den Assemblercode kritischer Funktionen 
angeschaut, und den C Code so geschrieben dass das gewünschte Asm 
rauskommt.
  Der neue Compiler macht das eine oder andere anders, und keiner wird 
da noch mal drüberschauen...

- C11 hat keine weltbewegenden Verbesserungen gegenüber C89.
  Interessanter wäre C++, aber dann würde der Kernel mit jeder neuen 
Compilerversion auseinanderfliegen.

- Der Kernel verwendet sowieso schon Gnu Erweiterungen wo nötig.

von 🐧 DPA 🐧 (Gast)


Lesenswert?

udok schrieb:
> - Die Programmierer haben sich den Assemblercode kritischer Funktionen
> angeschaut, und den C Code so geschrieben dass das gewünschte Asm
> rauskommt.

In 90% der fälle macht das keiner. nur wenn was nicht läuft, wie es 
soll, schaut man mal.

>   Der neue Compiler macht das eine oder andere anders, und keiner wird
> da noch mal drüberschauen...

Keiner wird alter Compiler Versionen verwenden, auch wenn der Code 
weiterhin c89 wäre, und --std=c89 gesetzt wäre, würden alle moderne 
Compilerversionen nehmen.

von 🐧 DPA 🐧 (Gast)


Lesenswert?

udok schrieb:
> - C11 hat keine weltbewegenden Verbesserungen gegenüber C89.
>   Interessanter wäre C++, aber dann würde der Kernel mit jeder neuen
> Compilerversion auseinanderfliegen.

Es gibt schon ein paar nette Sachen. z.B. static_assert ist einer meiner 
Favoriten. _Generic ist manchmal auch ganz praktisch. Da lässt sich dann 
das ein oder andere Macro etwas verschönern & sicherer machen.

von Zombie (Gast)


Lesenswert?

Kann mir das bitte jemand in C-Code übersetzen?

> Koschel hatte eine Unsicherheit identifiziert, die auf ein in C89 nicht
> lösbares Problem zurückzuführen war.
> Beim Fix einer USB-Komponente entdeckte Koschel, dass nach dem Durchlauf
> einer Schleife über eine verkettete Liste der Kopfzeiger der Liste mit
> ungültigem Inhalt nachfolgenden Code-Teilen fälschlich zur Verfügung stand.
> Das liegt schlicht daran, dass in C89 die Laufvariable der Schleife
> außerhalb der Schleife deklariert werden muss und damit auch nach dem
> Schleifenblock weiterhin sichtbar ist. Ein klassischer "Leak" der
> Laufvariablen. Beim Zugriff auf die Variable nach der Schleife kommt es zum
> Bug.

Ich habe versucht, die Konversation 
(https://lore.kernel.org/all/20220217184829.1991035-1-jakobkoschel@gmail.com/) 
nach zu vollziehen, aber verstehe nur Bahnhof.

Danke!

von 🐧 DPA 🐧 (Gast)


Lesenswert?

Auch nur schon in C99 sind gigantische Verbesserungen. "int x" nicht nur 
am Anfang der Funktion schreiben zu können, Sachen wie "for(int x;;)", 
usw. das macht den Code auch weniger Fehleranfällig.

von 🐧 DPA 🐧 (Gast)


Lesenswert?

Zombie schrieb:
> Das liegt schlicht daran, dass in C89 die Laufvariable der Schleife
>> außerhalb der Schleife deklariert werden muss und damit auch nach dem
>> Schleifenblock weiterhin sichtbar ist.

Das ist in C89 aber noch einfach zu fixen. Ein Block { ... { int bla; 
for(...){...} } ... } ist valide.

Es lässt sich aber nicht in das bestehende Macro verpacken, man hätte 
also den Code mit vielen {} verunstalten müssen.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Zombie schrieb:
> aber verstehe nur Bahnhof.

Seit C99 kannst du eine (allerdings auch nur eine) Schleifenvariable 
direkt in der for-Anweisung definieren; deren Scope ist dann lediglich 
die for-Anweisung selbst und die durch for gesteuerte Anweisung (die 
häufig wieder ein ganzer Block ist).

Nach diesen beiden Anweisungen ist diese Variable nicht mehr sichtbar.
1
   for (int i = 0; i < I_MAX; i++)
2
      do_something(i);
3
4
   // hier gibt es "i" nicht mehr

: Bearbeitet durch Moderator
von udok (Gast)


Lesenswert?

🐧 DPA 🐧 schrieb:
> Auch nur schon in C99 sind gigantische Verbesserungen. "int x" nicht nur
> am Anfang der Funktion schreiben zu können, Sachen wie "for(int x;;)",
> usw. das macht den Code auch weniger Fehleranfällig.

Gigantische Verbesserung?  Ich weiß nicht...

Ist alles natürlich Gewöhnungssache, aber ich mag es eigentlich lieber,
wenn alle Variablen am Anfang der Funktion klar deklariert sind.
Da weiß ich sofort wo ich suchen muss, und mit einem Tastenkürzel komme
ich hin.

Wenn ich aber viel C++ Programmiere, dann finde ich den C Weg wieder 
komisch...

Auf jeden Fall nur Kosmetik.

Aber aus eigener Erfahrung (Spieltrieb!), kann ich dir sagen,
das der alte WinDDK 7.1 MS Compiler (2008) ca. 2x so schnell compiliert,
wie der neue 2019'er.
Der C Code ist teilweise um bis zu 20% schneller und meist etwas 
kleiner.
Dafür macht der 2019 cl besseren C++ Code, und ist C++11 konform.
Ich habe sogar die Vermutung, das die Intel Entwickler auf die Asm 
Ausgabe
des WinDDK 7.1 Compilers ihre CPU optimiert haben, der Asm Code ist oft
etwas "komisch", aber meist schneller als der vom 2019 cl, clang oder 
gcc.
Zumindest bei den C Kompilern dürte das die "Krone" gewesen sein, 
zumindest ist es nicht mehr besser geworden.

Gruss,
Udo

von udok (Gast)


Lesenswert?

🐧 DPA 🐧 schrieb:
>> - Die Programmierer haben sich den Assemblercode kritischer Funktionen
>> angeschaut, und den C Code so geschrieben dass das gewünschte Asm
>> rauskommt.
>
> In 90% der fälle macht das keiner. nur wenn was nicht läuft, wie es
> soll, schaut man mal.

Eben, das ist das Problem.  Du findest die Fehler oft ja nicht,
und meist läuft ja alles - nur halt 10% langsamer
(Auch wenn ich eher auf 0.1-1% tippe).

von udok (Gast)


Lesenswert?

Ich muss jetzt gerade an ein paar wirklich böse Überraschungen der neuen
Compiler denken.  Der gcc nützt ja jede Freiheit des Standards aus, um 
den Entwicklern das Leben schwer zu machen, und um in theoretischen 
Benchmarks besser auszuschauen.  So ist etwa Überlaufverhalten von
INT in C nicht definiert.  Daher folgern die Deppen, dass man Code 
wegoptimieren kann das Überlaufen abfängt...  viel Spaß beim 
Fehlersuchen...

von Gerald B. (gerald_b)


Lesenswert?

C4 ist die Lösung für viele Probleme!
duck und weg

von udok (Gast)


Lesenswert?

Gerald B. schrieb:
> C4 ist die Lösung für viele Probleme!
> duck und weg

Trottel.
Die echten Probleme fangen damit erst an...

von Oliver S. (oliverso)


Lesenswert?

udok schrieb:
> So ist etwa Überlaufverhalten von
> INT in C nicht definiert.  Daher folgern die Deppen, dass man Code
> wegoptimieren kann das Überlaufen abfängt...  viel Spaß beim
> Fehlersuchen...

Code, der einen Überlauf abfängt, nach dem der schon aufgetreten ist, 
ist halt unnötig, weil der Standard erst gar keinen Überlauf zulässt. 
Klingt logisch, ist auch so.

Oliver

von (prx) A. K. (prx)


Lesenswert?

🐧 DPA 🐧 schrieb:
> Sachen wie "for(int x;;)",  usw.
> das macht den Code auch weniger Fehleranfällig.

Exakt damit konnte Torvalds überzeugt werden, Linux von der Beschränkung 
auf C89 zu lösen.

von Zombie (Gast)


Lesenswert?

Jörg W. schrieb:
> Seit C99 kannst du eine (allerdings auch nur eine) Schleifenvariable
> direkt in der for-Anweisung definieren; deren Scope ist dann lediglich
> die for-Anweisung selbst und die durch for gesteuerte Anweisung (die
> häufig wieder ein ganzer Block ist).
>
> Nach diesen beiden Anweisungen ist diese Variable nicht mehr sichtbar.
>    for (int i = 0; i < I_MAX; i++)
>       do_something(i);
>    // hier gibt es "i" nicht mehr

Soweit bin ich noch mitgekommen, aber wo genau liegt der Bug bei:
1
struct S { S *next; };
2
3
S *iterator = get_iterator();
4
5
for (; iterator != NULL; iterator = iterator->next) {
6
   do_something(iterator);
7
}
8
// hier ist entweder iterator == NULL oder (falls man mit break die
9
// Schleife vorzeitig verlassen hat) ist iterator ein gültiger Pointer auf
10
// ein Element der Liste (solange die Liste nicht manipuliert wurde). Eine
11
// dritte Möglichkeit sehe ich nicht.
notfalls gebe es noch
1
{
2
    S *iterator = get_iterator();
3
4
    for (; iterator != NULL; iterator = iterator->next) {
5
       do_something(iterator);
6
    }
7
}
oder gibt es das in C auch nicht?

P.S. ich programmiere seit Jahren nur C++, wahrscheinlich ist das kein 
korrekter C-Code. Man möge es mir nachsehen. Aber das Prinzip sollte ja 
gleich sein.

von Stefan F. (Gast)


Lesenswert?

(prx) A. K. schrieb:
>> Sachen wie "for(int x;;)",  usw.
>> das macht den Code auch weniger Fehleranfällig.

> Exakt damit konnte Torvalds überzeugt werden, Linux von der Beschränkung
> auf C89 zu lösen.

Erstaunlich, dass man sich darüber noch streiten muss. Ich frage mich, 
ob der Meister jemals in modernen Sprachen (z.B. Go) programmieren 
würde, ohne Herpes-Bläschen zu bekommen.

(geschrieben auf einem Linux Laptop)

von (prx) A. K. (prx)


Lesenswert?

Stefan ⛄ F. schrieb:
> Erstaunlich, dass man sich darüber noch streiten muss.

Dazu solltest du die entsprechende Diskussion im Detail nachlesen. Ich 
bin mir ziemlich sicher, dass Torvalds keine Herpes-Bläschen als Grund 
für seine Haltung nannte.

: Bearbeitet durch User
von udok (Gast)


Lesenswert?

Stefan ⛄ F. schrieb:
> Erstaunlich, dass man sich darüber noch streiten muss. Ich frage mich,
> ob der Meister jemals in modernen Sprachen (z.B. Go) programmieren
> würde, ohne Herpes-Bläschen zu bekommen.

Darüber muss man auch nicht streiten...
Per Punkt ist: Wenn man das zulässt, dann geht das nicht mit dem C89 
Standard, und dann hat man einen anderen Compiler und einen 
Rattenschwanz an Problemchen...
Schon klar das die, die Bugs nicht suchen müssen lautstark dafür sind.
Weil neu muss ist ja definitionsgemäss immer vieell besser.
In irgendeiner Pimperlsoftware spielt das auch eher keine grosse Rolle.
Linux ist aber nun mal extrem Hardware- und Compilerabhängig.
Das ist so wie bei einer uC Firmware, da will ich auch keinen Compiler,
der glaubt gescheiter zu sein als ich.
Wobei was ich weiss, der Kernel schon seit Jahren mit neuen gcc 
Versionen compiliert wird, und da wurde auch heftig mit den gcc 
Entwicklern gestritten.
Daher dürfte das aber hier schon alles durch sein, und das Thema ist nur
eine Zeitungsente...

von linux fährt gegen die wand (Gast)


Lesenswert?

(prx) A. K. schrieb:
> Exakt damit konnte Torvalds überzeugt werden, Linux von der Beschränkung
> auf C89 zu lösen.

Er hat doch schon vorher aufgegeben. Bei Rust. Bald steigt er ganz aus. 
Der Laden wird immer mehr von den anderen übernommen.

Stallman zeigt dagegen immer noch, dass sein Rückgrat aus Stahl ist 
(egal was man von seinen Ideen hält).

von Georg A. (georga)


Lesenswert?

udok schrieb:
> Ich muss jetzt gerade an ein paar wirklich böse Überraschungen der neuen
> Compiler denken.  Der gcc nützt ja jede Freiheit des Standards aus, um
> den Entwicklern das Leben schwer zu machen, und um in theoretischen
> Benchmarks besser auszuschauen.  So ist etwa Überlaufverhalten von
> INT in C nicht definiert.  Daher folgern die Deppen, dass man Code
> wegoptimieren kann das Überlaufen abfängt...  viel Spaß beim
> Fehlersuchen...

Oder die Crashes mit total komischem Backtrace, wenn in einer als "int 
foo(...)" deklarierten Funktion ein return mit Wert fehlt (zB. return 0 
am Ende). Gerade wenn man viel obskure Sachen mit Objekten, malloc und 
Co macht, sucht man erstmal lange an dert völlig falschen Stelle...

von Nano (Gast)


Lesenswert?

Also  ich finde es sehr gut, dass man auf eine neuere C Version 
umsteigt.

Allerdings hätte man auch gleich auf C18 umsteigen können, anstatt nur 
C11.
Denn C18 ist nur ein Bugfix von C11, während C11 die Bugs noch hat.

https://www.open-std.org/jtc1/sc22/wg14/www/docs/n2244.htm

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Zombie schrieb:
> oder gibt es das in C auch nicht?

Iteratoren? Per se nicht, kann man sicher irgendwie nachbilden.
Und C++ konnte diese Syntax der for-Schleife schon lange.

von Rolf M. (rmagnus)


Lesenswert?

udok schrieb:
> Ich muss jetzt gerade an ein paar wirklich böse Überraschungen der neuen
> Compiler denken.  Der gcc nützt ja jede Freiheit des Standards aus, um
> den Entwicklern das Leben schwer zu machen, und um in theoretischen
> Benchmarks besser auszuschauen.  So ist etwa Überlaufverhalten von
> INT in C nicht definiert.  Daher folgern die Deppen, dass man Code
> wegoptimieren kann das Überlaufen abfängt...  viel Spaß beim
> Fehlersuchen...

Deppen sind diejenigen, die sich auf ein bestimmtes Überlaufverhalten 
verlassen, obwohl sie eigentlich wissen, dass das in C undefiniert ist.

(prx) A. K. schrieb:
> Ich
> bin mir ziemlich sicher, dass Torvalds keine Herpes-Bläschen als Grund
> für seine Haltung nannte.

Die Gründe, die er bei verschiedenen Themen für seine Haltung angibt, 
sind  manchmal nicht viel besser.

udok schrieb:
> Weil neu muss ist ja definitionsgemäss immer vieell besser.

"neu" ist aber auch Ansichtssache. Es geht hier darum, eine Version von 
C, die noch aus den Achtzigern stammt, durch eine zu ersetzen, die 
inzwischen auch schon über ein Jahrzehnt alt ist.

von Zombie (Gast)


Lesenswert?

Jörg W. schrieb:
> Zombie schrieb:
>> oder gibt es das in C auch nicht?
>
> Iteratoren? Per se nicht, kann man sicher irgendwie nachbilden.
> Und C++ konnte diese Syntax der for-Schleife schon lange.

Nein, ich meinte anonyme Block scopes (mir fiel der Name vorher nicht 
ein)

von fritz (Gast)


Lesenswert?

Stefan ⛄ F. schrieb:
> Stattdessen wird nun auch C11 gesetzt.

Was ist da jetzt der Vorteil?
Sorry, ich habe vor 20 Jahren das letzte mal etwas programmiert.

von Stefan F. (Gast)


Lesenswert?

fritz schrieb:
> Was ist da jetzt der Vorteil?

Im verlinkten Heise Artikel wurde der konkrete Vorteil genannt, der zu 
der Entscheidung für das Upgrade führte.

Oder wolltest zu eine Zusammenfassung aller Neuigkeiten in C11? Dazu 
gibt es bestimmt ein Buch zu kaufen. Die Liste ist lang.

von Wilhelm M. (wimalopaan)


Lesenswert?

Jörg W. schrieb:
> Zombie schrieb:
>> oder gibt es das in C auch nicht?
>
> Iteratoren? Per se nicht, kann man sicher irgendwie nachbilden.
> Und C++ konnte diese Syntax der for-Schleife schon lange.

Natürlich gibt es Iteratoren in C!
Alle Zeiger sind Iteratoren (also auch in C vorhanden).
Nicht alle Iteratoren sind Zeiger (andere Iteratoren gibt es dann eben 
in C nicht).

von Nano (Gast)


Lesenswert?

fritz schrieb:
> Stefan ⛄ F. schrieb:
>> Stattdessen wird nun auch C11 gesetzt.
>
> Was ist da jetzt der Vorteil?
> Sorry, ich habe vor 20 Jahren das letzte mal etwas programmiert.

Ab hier geht's los:
https://de.wikipedia.org/wiki/Varianten_der_Programmiersprache_C#Neuerungen_von_C90

von Wilhelm M. (wimalopaan)


Lesenswert?

Nano schrieb:
> fritz schrieb:
>> Stefan ⛄ F. schrieb:
>>> Stattdessen wird nun auch C11 gesetzt.
>>
>> Was ist da jetzt der Vorteil?
>> Sorry, ich habe vor 20 Jahren das letzte mal etwas programmiert.
>
> Ab hier geht's los:
> 
https://de.wikipedia.org/wiki/Varianten_der_Programmiersprache_C#Neuerungen_von_C90

In dem Abschnitt "Beispiele" des o.g. Artikels liest es sich fast so, 
als wäre bei C99/11 das Schlüsselwort `const` wieder entfallen.

Eine andere Übersicht befindet sich in :

https://en.cppreference.com

von W.S. (Gast)


Lesenswert?

Stefan ⛄ F. schrieb:
> Stattdessen wird nun auch C11 gesetzt.

OMG! Welch eine weltbewegende Revolution!

Also, die einzige wirklich bedeutsame Verbesserung an C war der Übergang 
von K&R nach ANSI. Was danach noch weiters aufgefallen ist, war die 
Einführung von // und 'long long' und das war's. All das Gelaber über 
das Herumwurschteln in den mitgelieferten Funktionen und die Einführung 
einer Header-Datei für das Kanalisieren von Wildwuchs bei 
Integer-Bezeichnungen und das Einführen des Wortes 'bool' sind eher wie 
Trampeln auf der Stelle, weil jegliche Fortbewegung verboten ist zuliebe 
der 'Kompatibilität'. Nicht einmal eine saubere Größenfestlegung für 
Integers oder die Trennung von Textzeichen und Integer haben die in den 
letzten 30 Jahren hingekriegt.

Und das soll jetzt Grund sein für weitere Diskussionen?
Selbst HIER ?

Kopfschüttel...

W.S.

von Stefan F. (Gast)


Lesenswert?

W.S. schrieb:
> OMG! Welch eine weltbewegende Revolution!

Für Linux ist es eine. Und für einige Mikrocontroller-Experten wäre es 
das ebenfalls.

Hier gibt es doch jede Woche irgend jemanden, der Vorschläge mit "das 
ist aber nicht originales C" (womit meist C89 gemeint ist) ablehnt.

von youri (Gast)


Lesenswert?

Das Wort Revolution wird heutzutage sehr inflationär gebraucht. Jeder 
kleine Furz wird als Revolution bezeichnet.

von MaWin (Gast)


Lesenswert?

W.S. schrieb:
> Was danach noch weiters aufgefallen ist, war die
> Einführung von // und 'long long' und das war's.

Ehm, tut mir leid. Aber du hast leider keine Ahnung.

https://en.cppreference.com/w/c

C hat mittlerweile viele nützliche Dinge im Sprachstandard/Stdlib 
eingebaut. Unter anderem auch Threading und alles was dazu gehört.

Und es wird noch viel mehr kommen:
https://en.cppreference.com/w/c/23

von MaWin (Gast)


Lesenswert?

Stefan ⛄ F. schrieb:
> Stattdessen wird nun auch C11 gesetzt.

Ich halte das eher für eine Formalität.
Linux war noch nie in einem standardisierten C-Dialekt geschrieben und 
verwendete schon immer extrem viele Gnu-Spracherweiterungen.
Sehr viele C99-Features sind über Gnu-Erweiterungen seit Ewigkeiten im 
Kernel in Verwendung. Zum Beispiel Named Initializers.

Ich war ehrlich gesagt recht überrascht, dass Linux bisher C89+Gnu als 
"den Standard" für sich definierte. Der Code sieht nämlich durch und 
durch sehr C99-like aus.

Der gemeinsame Compiler-Nenner wird vielmehr von den 
Enterprise-Distributionen bestimmt.
Der Kernel unterstützt schon immer sehr alte Gnu-Compilerversionen und 
hat Tonnen von Workarounds an Bord für alte verbuggte 
Enterprise-Compiler.
Und es wurde schon immer regelmäßig Support für alte Compiler 
rausgeworfen, wenn man sich sicher war, dass niemand es mehr benötigen 
wird.
Und das ist in diesem Fall auch nicht anders. Außer, dass jetzt das 
Label "C11" dran klebt und man damit natürlich schönere 
Fachzeitschriftenartikel generieren kann, als wenn irgendein alter 
RHEL-Compiler aus dem Support rausgenommen wird.

von Nano (Gast)


Lesenswert?

Wilhelm M. schrieb:
> Nano schrieb:
>> fritz schrieb:
>>> Stefan ⛄ F. schrieb:
>>>> Stattdessen wird nun auch C11 gesetzt.
>>>
>>> Was ist da jetzt der Vorteil?
>>> Sorry, ich habe vor 20 Jahren das letzte mal etwas programmiert.
>>
>> Ab hier geht's los:
>>
> 
https://de.wikipedia.org/wiki/Varianten_der_Programmiersprache_C#Neuerungen_von_C90
>
> In dem Abschnitt "Beispiele" des o.g. Artikels liest es sich fast so,
> als wäre bei C99/11 das Schlüsselwort `const` wieder entfallen.

Gut aufgepasst.

Das war sogar mal richtig.
Dann hat die IP 46.114.33.8 am 31.Okt 2019 um 23:26 Uhr einen EDIT 
vorgenommen und das wieder rausgemacht.

https://de.wikipedia.org/w/index.php?title=Varianten_der_Programmiersprache_C&oldid=193639459#Beispiele_f%C3%BCr_den_Unterschied_zwischen_verschiedenen_Fassungen_der_Sprache_C

Bzw.

https://de.wikipedia.org/w/index.php?title=Varianten_der_Programmiersprache_C&diff=193639459&oldid=192748157

Laut IP Lookup kommt der Newb aus Brandenburg.
Verschiedene GEO IP Locations geben Gross Beuchow oder Berlin als Ort 
an.

Du kannst das aber wieder korrigieren, die WP lädt ja zur Mitarbeit ein.

von Nano (Gast)


Lesenswert?

W.S. schrieb:
> Stefan ⛄ F. schrieb:
>> Stattdessen wird nun auch C11 gesetzt.
>
> OMG! Welch eine weltbewegende Revolution!
>
> Also, die einzige wirklich bedeutsame Verbesserung an C war der Übergang
> von K&R nach ANSI. Was danach noch weiters aufgefallen ist, war die
> Einführung von // und 'long long' und das war's.

Das sehe ich aber anders.

Mit C11 kam Spracheigener Multi-threading support und verbesserter 
Unicode Support:
> Improved Unicode support based on the C Unicode Technical Report ISO/IEC
> TR 19769:2004 (char16_t and char32_t types for storing UTF-16/UTF-32
> encoded data, including conversion functions in <uchar.h> and the
> corresponding u and U string literal prefixes, as well as the u8 prefix
> for UTF-8 encoded literals).
https://en.wikipedia.org/wiki/C11_(C_standard_revision)

> Nicht einmal eine saubere Größenfestlegung für
> Integers oder die Trennung von Textzeichen und Integer haben die in den
> letzten 30 Jahren hingekriegt.

Weil ein Integer nun einmal auf einer 16 Bit, 32 Bit und 64 Bit Maschine 
immer anders ist und es gewachsenen Code gibt.
Außerdem konntest du schon immer deine eigenen Integertypen definieren 
bzw. die von größeren Bibliotheken nutzen, wenn du diese benutzt hast.

von Stefan F. (Gast)


Lesenswert?

W.S. schrieb:
> Nicht einmal eine saubere Größenfestlegung für Integers
> ... haben die in den letzten 30 Jahren hingekriegt.

Kennst du uint8_t uint16_t uint32_t und Verwandte nicht?

von Wilhelm M. (wimalopaan)


Lesenswert?

Nano schrieb:
> Wilhelm M. schrieb:
>> Nano schrieb:
>>> fritz schrieb:
>>>> Stefan ⛄ F. schrieb:
>>>>> Stattdessen wird nun auch C11 gesetzt.
>>>>
>>>> Was ist da jetzt der Vorteil?
>>>> Sorry, ich habe vor 20 Jahren das letzte mal etwas programmiert.
>>>
>>> Ab hier geht's los:
>>>
>>
> 
https://de.wikipedia.org/wiki/Varianten_der_Programmiersprache_C#Neuerungen_von_C90
>>
>> In dem Abschnitt "Beispiele" des o.g. Artikels liest es sich fast so,
>> als wäre bei C99/11 das Schlüsselwort `const` wieder entfallen.
>
> Gut aufgepasst.

const-correctness ist ein zentraler Baustein zu fehlerarmen Code.
Doch an diesem schwachsinnigen Edit bei WP sieht man mal wieder, wie 
viele Unwissende es da wie hier gibt.

Wie sinnvoll bspw. folgendes ist, können die C89-Verfechter kaum 
erahnen:
1
void foo(const char* const*);
2
void foo(const char* const* const a) {}
3
4
void bar(int);
5
void bar(const int b) {}

von (prx) A. K. (prx)


Lesenswert?

Die Deklarationssyntax von C wurde von Anfang an verkackt. C89 konnte 
das aus Kompatibilitätsgründen nicht ändern und musste mit const&Co eine 
neue Klasse der Verwirrung beisteuern.

Und so muss man eben mit solch seltsamen Konstruktionen leben. Oder die 
Sprache wechseln. Aber von C zu erwarten, sich nicht zu erweitern, 
sondern sich von Grund auf zu ändern, widerspricht dem Ansatz seit 
Jahrzehnten.

: Bearbeitet durch User
von Stefan F. (Gast)


Lesenswert?

Wilhelm M. schrieb:
> Wie sinnvoll bspw. folgendes ist, können die C89-Verfechter kaum
> erahnen

Ich habe da noch nie durchgeblickt, deswegen nutze ich es nicht.

> Die Deklarationssyntax von C ist von Anfang an verkackt.

Allerdings, "static" ist so ein Wort. Kennt ihr die Videorecorder aus 
den 80er Jahren, wo jede Taste vierfach belegt wurde? Die kommen von der 
selben Generation der Entwickler.

von Wilhelm M. (wimalopaan)


Lesenswert?

Stefan ⛄ F. schrieb:
> Wilhelm M. schrieb:
>> Wie sinnvoll bspw. folgendes ist, können die C89-Verfechter kaum
>> erahnen
>
> Ich habe da noch nie durchgeblickt, deswegen nutze ich es nicht.

Das solltest Du schleunigst ändern: suche Dir eine Variante von 
west-const oder east-const aus, und bleib dabei. Der Rest ist doch easy.

(Dann war es dann ja wohl für Dich mit besserem C++)

>> Die Deklarationssyntax von C ist von Anfang an verkackt.
>
> Allerdings, "static" ist so ein Wort.

... allerdings für jeden Zweck (storage duration, linkage, class member) 
wieder eigene Schlüsselwörter wäre auch nicht gut.

von Stefan F. (Gast)


Lesenswert?

Wilhelm M. schrieb:
> allerdings für jeden Zweck
> wieder eigene Schlüsselwörter wäre auch nicht gut.

Doch, finde ich schon.

von (prx) A. K. (prx)


Lesenswert?

Stefan ⛄ F. schrieb:
> Allerdings, "static" ist so ein Wort

Das ist vergleichsweise harmlos. Der Knaller ist der deklaratorische 
Rösselsprung mit dynamischem Richtungswechsel der Interpretation über 
Operatorvorrang, statt strikt linearer Syntax. Also statt 
(ausgeschrieben)
   array of pointer to const char
   array of const pointer to char
   pointer to array of const char
hat man so Schönheiten wie
   const char * []
   char * const []
   const char (*) []

Also nicht hübsch von links nach rechts gehen, sondern erst einmal 
mitten drin in dem Salat die Stelle finden, bei der man anfängt, und 
dann anhand des Vorrangs teils links teils rechts weiter machen. Der 
Compiler tut sich damit leicht, der Mensch weniger.

Das const konnte man dann anno C89 nicht mehr vor * schreiben, ohne das 
Prinzip zu verletzen. Skrupellose Genossen haben das zwar anno 16-Bit 
x86 mit _far gemacht (1), und das sah auch schöner aus, war indes 
seitens der Sprachlogik eine Zumutung.

Das hing natürlich mit dem Grundfehler in Expressions zusammen, die 
Dereferenzierung davor zu schreiben, die Indizierung jedoch 
dahinter. Mit Dereferenzierung auch dahinter wäre einiger Spuk 
verschwunden. Ich meine mich zu erinnern, dass man das in der 
Vorgeschichte auch so plante, dann aber über eine Zweideutigkeit mit der 
Multiplikation stolperte. Aber statt dann eben für die Dereferenzierung 
ein anderes Symbol zu verwenden, schmiss man ersatzweise das Kind in den 
Brunnen.

1: In "_far * const" haben beide Keywords eigentlich die gleiche Rolle 
im Bezug, stehen aber an unterschiedlicher Stelle. Angebrachter wäre "* 
_far const" gewesen.

: Bearbeitet durch User
von Wilhelm M. (wimalopaan)


Lesenswert?

(prx) A. K. schrieb:
> Stefan ⛄ F. schrieb:
>> Allerdings, "static" ist so ein Wort
>
> Das ist vergleichsweise harmlos. Der Knaller ist der deklaratorische
> Rösselsprung mit dynamischem Richtungswechsel der Interpretation über
> Operatorvorrang, statt strikt linearer Syntax.

Naja, diesen Syntax-Kram finde ich vergleichsweise harmlos. Die größte 
Sünde m.E. ist, dass man mit etwa dem Übergang zu C89 aus C nicht eine 
objekt-basierte Sprache draus gemacht hat. Der Grund dafür ist 
natürlich, dass es das dann mit C++ schon gab (C++ inkludiert u.a. das 
objektorientierte Paradigma, welches das objektbasierte inkludiert).
In C kann man bis heute nicht eine vorzeichenlose Ganzzahl von einem 
Zeichen von einem (semantikfreien) Byte unterscheiden.
Das ist der Grund, warum ich nur noch C++ verwende, und dies auch immer 
jedem empfehle.

: Bearbeitet durch User
von (prx) A. K. (prx)


Lesenswert?

Wilhelm M. schrieb:
> dass man mit etwa dem Übergang zu C89 aus C nicht eine
> objekt-basierte Sprache draus gemacht hat

Das wäre eine neue Sprache gewesen, die verwirrenderweise heisst wie die 
alte. Und hätte folglich zu einer Gabelung in der Sprachentwicklung 
geführt. Immerhin gab es ja schon reichlich Code, massgeblich basierend 
auf Unix. Solche radikalen Schritte kann man machen, hat man seither 
immer wieder gemacht, aber dann freundlicherweise anders genannt.

: Bearbeitet durch User
von Wilhelm M. (wimalopaan)


Lesenswert?

(prx) A. K. schrieb:
> Wilhelm M. schrieb:
>> dass man mit etwa dem Übergang zu C89 aus C nicht eine
>> objekt-basierte Sprache draus gemacht hat
>
> Das wäre eine neue Sprache gewesen,

Habe ich ja oben geschrieben: und die heißt C++.

von Stefan F. (Gast)


Lesenswert?

Wer C mag, aber wem C++/Java/C# zu hoch ist, dem kann ich mal Go 
empfehlen (leider nur auf PC, nicht Mikrocontroller).

Go hat sehr viel von C abgeguckt und ist ähnlich rudimentär. Aber es 
unterstützt auch so etwas ähnliches wie Objekte, nur viel primitiver als 
in C++ und hat eine praktische Garbage Collection.

Für mich ist es ein angenehmer Kompromiss zwischen den absolut nötigen 
Basics und einer akademisch aufgeblähten Sprache die nur jeder 5. 
Anwender vollständig versteht.

Mir würde es gefallen, wenn Go auch für AVR und Cortex-M verwendbar 
wäre. Ist leider nicht der Fall.

Zum Beispiel haben sie dort mit dem "deklaratorischen
Rösselsprung mit dynamischem Richtungswechsel der Interpretation" 
aufgeräumt.
1
Zeichenkette:                             string
2
Zeiger auf String:                        *string
3
Array von Strings:                        []string
4
Array von Zeigern auf Strings:            []*string
5
Zeiger auf Array von Strings:             *[]string
6
Zeiger auf Array von Zeigern auf Strings: *[]*string

So ist das total logisch, oder?

Was ich auch mega praktisch finde: In Go können Funktionen mehrere 
Rückgabewerte haben.

von (prx) A. K. (prx)


Lesenswert?

Stefan ⛄ F. schrieb:
> So ist das total logisch, oder?

Ist es. War mir auch schon aufgefallen. Die vielleicht erste von C 
inspirierte Sprache, die mit dem Unfug aufräumte. Davor hatte sich das 
niemand getraut.

: Bearbeitet durch User
von Wilhelm M. (wimalopaan)


Lesenswert?

Stefan ⛄ F. schrieb:
> Wer C mag, aber wem C++/Java/C# zu hoch ist, dem kann ich mal Go
> empfehlen (leider nur auf PC, nicht Mikrocontroller).
>
> Go hat sehr viel von C abgeguckt und ist ähnlich rudimentär.

Ja, Go ist ganz cool, vor allem recht stressfrei bei Nebenlääufigkeit.

> Aber es
> unterstützt auch so etwas ähnliches wie Objekte, nur viel primitiver als
> in C++ und hat eine praktische Garbage Collection.

Ich bin sehr froh, das in C++ keine GC notwendig / vorhanden ist.

von Stefan F. (Gast)


Lesenswert?

Wilhelm M. schrieb:
> Ich bin sehr froh, das in C++ keine GC notwendig / vorhanden ist.

Gibt es eigentlich eine Programmiersprache, wo man (ohne Tricks bzw 
fremder Bibliotheken) wahlweise mit oder ohne Garbage Collection 
arbeiten kann?

von MaWin (Gast)


Lesenswert?

Stefan ⛄ F. schrieb:
> Gibt es eigentlich eine Programmiersprache, wo man (ohne Tricks bzw
> fremder Bibliotheken) wahlweise mit oder ohne Garbage Collection
> arbeiten kann?

Was soll das bringen?

Man kann in Python den GC abschalten und dann manuell die Objekte 
freigeben.
In CPython ist der GC wegen refcounting eh nur mit Nebensächlichkeiten 
beschäftigt. Deshalb brauchts für viele Python-Programme auch gar keinen 
GC.

von Stefan F. (Gast)


Lesenswert?

MaWin schrieb:
> Man kann in Python den GC abschalten und dann manuell die Objekte
> freigeben.

Danke, gut zu wissen. Vielleicht brauche ich das mal.

von db8fs (Gast)


Lesenswert?

Wilhelm M. schrieb:
> Ich bin sehr froh, das in C++ keine GC notwendig / vorhanden ist.

Dito.
Mit std::shared_ptr<> optional zu arbeiten, wenn man massiv dynamische 
Gebilde allokieren muss, ist sehr nützlich. Aber per default für alles 
möcht ich's auch nicht unbedingt haben in C++. Das Gute an C++ sind die 
unterschiedlichen Lösungsmöglichkeiten für Implementierungen damit - 
aber halt eben manchmal auch die Ursache von Problemen.

Zum Thema selber: ich finds grundsätzlich nicht verkehrt, dass C11 beim 
Kernel genutzt werden soll. Ich konnte diese Fokussiertheit auf C89 
nicht so richtig verstehen - wenn man den alten Deklarationsstyle halt 
im Kernel als Stil beibehalten möchte, spricht ja nix dagegen, dass über 
Style-Guides festzulegen.

Könnte aber vielleicht n Thema sein für jemand, der nen alten 
zertifizierten GCC nutzen muss, um nen Kernel zu übersetzen - k.a. 
vielleicht isses da ungünstig dafür.

Egal. Btw. kann man mittlerweile eigentlich beim MSVC die SQLite mit C99 
übersetzen? Wär auch mal an der Zeit...

von Nano (Gast)


Lesenswert?

(prx) A. K. schrieb:
> Die Deklarationssyntax von C wurde von Anfang an verkackt. C89 konnte
> das aus Kompatibilitätsgründen nicht ändern
> ...
> Aber von C zu erwarten, sich nicht zu erweitern,
> sondern sich von Grund auf zu ändern, widerspricht dem Ansatz seit
> Jahrzehnten.

Ja, man hätte möglichst früh aufräumen müssen.
Soviel C Code konnte das Ende 1980 ja noch nicht gewesen sein, dass es 
unmöglich sei, das alles anzupassen.

Jetzt wäre es viel teurer.

von Nano (Gast)


Lesenswert?

(prx) A. K. schrieb:
> Stefan ⛄ F. schrieb:
>> So ist das total logisch, oder?
>
> Ist es. War mir auch schon aufgefallen. Die vielleicht erste von C
> inspirierte Sprache, die mit dem Unfug aufräumte. Davor hatte sich das
> niemand getraut.

Das gab es schon in Java, Java erlaubt nur beide Formen, also:

Datentyp[] varname; // so wie man es in Java machen soll
und
Datentyp varname[]; // wie in C

Siehe dazu auch:
https://openbook.rheinwerk-verlag.de/javainsel/04_001.html#u4.1.2

Und bei Go ließ man sich von Java inspirieren und damit kam es auch 
später.

von Nano (Gast)


Lesenswert?

Stefan ⛄ F. schrieb:
> Wilhelm M. schrieb:
>> Ich bin sehr froh, das in C++ keine GC notwendig / vorhanden ist.
>
> Gibt es eigentlich eine Programmiersprache, wo man (ohne Tricks bzw
> fremder Bibliotheken) wahlweise mit oder ohne Garbage Collection
> arbeiten kann?

Die Programmiersprache D erlaubt es die Sprache mit und ohne GC 
wahlweise zu nutzen.
https://de.wikipedia.org/wiki/D_(Programmiersprache)

von W.S. (Gast)


Lesenswert?

Stefan ⛄ F. schrieb:
> Kennst du uint8_t uint16_t uint32_t und Verwandte nicht?

Und wozu dient dann sowas wie stdint.h ? Nee, ne Headerdatei kann sich 
jeder selber schreiben. Das ist was anderes, als Datentypen in einer 
Sprachdefinition. Man könnte rein theoretisch die Typen auch karkheinz, 
moritz und ottokar nennen. Das geht auch mit einer Headerdatei und dem 
Compiler ist das schnurz, weil der nach dem Präprozessor diesen ganzen 
Zirkus nicht mehr sieht, sondern eben wie ganz früher char, int und long 
int usw.

W.S.

von (prx) A. K. (prx)


Lesenswert?

Nano schrieb:
> Soviel C Code konnte das Ende 1980 ja noch nicht gewesen sein, dass es
> unmöglich sei, das alles anzupassen.

Damals hielt man es für viel. Vorhersagen über mehrere Jahrzehnte sind 
etwas problematisch, weshalb man solche Bilanzen in umgekehrter Richtung 
einfacher ziehen kann. Keiner wusste während der Standisierungsphase 
Mitte 80er, dass ausgerechnet C derart dominieren wird.

: Bearbeitet durch User
von W.S. (Gast)


Lesenswert?

(prx) A. K. schrieb:
> Aber statt dann eben für die Dereferenzierung
> ein anderes Symbol zu verwenden, schmiss man ersatzweise das Kind in den
> Brunnen.

Naja, so ähnlich sehe ich das auch. Was die Spracherfinder geritten hat, 
bereits langetablierte Zeichen anderweitig zu verwenden, weiß bloß der 
Geier.

Das Gleichheitszeichen als Zuweisungsoperator, womit man sich Vergleiche 
verbaut hat und dann als Ausweich 'gleichgleich' für die Vergleiche. 
Oder eben den Asterisk als 'Adresse von', womit man dann eben in 
Konflikt mit dem Multiplikationszeichen kommt.

Und das alles ohne Rücksicht darauf, daß zumindest in Europa so ziemlich 
alle Kinder mal zur Schule gegangen sind und dort sowas wie = und * für 
etwas ganz anderes gelernt haben und es sogar bereits damals auf den 
Tastaturen ein @ gegeben hat, was als Zeichen für das Zeigen auf.. 
durchaus in Frage gekommen wäre.

Naja, und von sowas wie einem Unitsystem mit geregelter Bekanntgabe von 
Dingen, die in einer Quelle sind, wollen wir erst garnicht reden. 
Allerdings sehe ich bei so einigen Leuten hier eine Kurzsichtigkeit, die 
mich graust. Da meint z.B. der Stefan, daß das Schreiben einer 
Headerdatei, wo lediglich einige Alias-Namen für altgediente 
Integerbezeichnungen bereits eine Sprachänderung sei.

W.S.

von Stefan F. (Gast)


Lesenswert?

Ich denke die meisten sind sich einig: C ist hässlich, aber für uns 
führt kaum ein Weg daran vorbei.

von Zeno (Gast)


Lesenswert?

Stefan ⛄ F. schrieb:
> Ich denke die meisten sind sich einig: C ist hässlich, aber für uns
> führt kaum ein Weg daran vorbei.
Oh Stefan das aus Deinem Munde - macht mich fast sprachlos :-)

von MaWin (Gast)


Lesenswert?

db8fs schrieb:
> wenn man den alten Deklarationsstyle halt
> im Kernel als Stil beibehalten möchte

Im Kernel werden seit jeher Gnu-Struct-declarations verwendet, bis die 
durch C99-Style ersetzt wurden. C89-Struct-Initializers findet man 
praktisch nicht.

von MaWin (Gast)


Lesenswert?

W.S. schrieb:
> Und wozu dient dann sowas wie stdint.h ? Nee, ne Headerdatei kann sich
> jeder selber schreiben. Das ist was anderes, als Datentypen in einer
> Sprachdefinition.

Ziemlicher Unsinn.
Die stdlib gehört zum Sprachumfang und wird mit der Sprache gepflegt.
Das mit einem selbstgefrickelten Header zu vergleichen, ist einfach nur 
Unsinn.

Ja, das Typsystem von C ist völlig verbastelt und unzulänglich.
Aber die fixed-size-Typen aus stdint gehören zur Sprache.

von W.S. (Gast)


Lesenswert?

MaWin schrieb:
> Aber die fixed-size-Typen aus stdint gehören zur Sprache.

Nein, sie gehören lediglich zu einer Headerdatei. Und wenn irgendwer 
dazu Lust haben sollte, dann schreibt er eine andere Headerdatei und 
benennt dort eben int in mawin um. Das geht, wäre so auch benutzbar, 
gehört aber nicht zum Sprachumfang.

Nur mal so als Denkanstoß: Wenn es im Winter kalt ist und du einen 
Mantel trägst, gehört dann der Mantel zu deinen Körperteilen? Er ist 
vermutlich dein Eigentum, aber er ist kein Körperteil von dir, sage ich.

W.S.

von Nano (Gast)


Lesenswert?

W.S. schrieb:
> Oder eben den Asterisk als 'Adresse von', womit man dann eben in
> Konflikt mit dem Multiplikationszeichen kommt.
>
> Und das alles ohne Rücksicht darauf, daß zumindest in Europa so ziemlich
> alle Kinder mal zur Schule gegangen sind und dort sowas wie = und * für
> etwas ganz anderes gelernt haben und es sogar bereits damals auf den
> Tastaturen ein @ gegeben hat, was als Zeichen für das Zeigen auf..
> durchaus in Frage gekommen wäre.

Ich schätze mal, dass man den Asterisk deswegen genommen hat, weil er 
eben wie in Mathe und Physik in Schriftform am ehesten einem Vektor 
entspricht, der in die Ebene hineinzeigt.

Das @ dagegen war damals gar nicht groß etabiliert, das hat fast keiner 
als "at" Symbol gekannt und war daher viel zu abstrakt.

von MaWin (Gast)


Lesenswert?

W.S. schrieb:
> Nein, sie gehören lediglich zu einer Headerdatei. Und wenn irgendwer
> dazu Lust haben sollte, dann schreibt er eine andere Headerdatei und
> benennt dort eben int in mawin um.

So ein Bullenkot.

von Klaus W. (mfgkw)


Lesenswert?

Danke für die Info.

Und ich Depp dachte immer, malloc(), printf(), FILE, und wie sie alle 
heißen, würden zu C gehören. Wie naiv!

von udok (Gast)


Lesenswert?

Stefan ⛄ F. schrieb:
> Ich denke die meisten sind sich einig: C ist hässlich, aber für uns
> führt kaum ein Weg daran vorbei.

Ich weiss nicht, ich mag C und finde es sehr elegant.
C hat gewaltige Vorteile gegenüber jeder anderen Sprache:
- EIN einziger Weg zum Ziel (z.B. Nur Pointer, keine Referenzen)
- Relativ schnell erlernbar, wer will ist je nach Vorwissen in einer 
Woche bis einem Monat dabei.
- Klare Strukturen und geradlinige und lesbare Programme.
  (Die wichtigen Dinge werden linear abgearbeitet und nicht in einer 
virtuellen Klasse in einer dreifach verschachtelten Inline-Funktion 
versteckt, oder in einem Konstruktor wo keiner genau weiss wann der 
aufgerufen wird.
- Keine überladenen Operatoren, wo man nicht weiss was passiert wenn man 
es nicht selber geschrieben hat.
- Einfache Fehlerbehandlung, keine Exceptions die irgendwohin springen.
- Effizient und doch portabel.
- Gute Standard Bibliotheken.
- Wenig Schreibarbeit und leicht lesbar.
- Kleine Versuchung unnötigen Code zu schreiben weil eine "Klasse sonst 
nicht vollständig" ist.

Zugegeben ist das Typensystem etwas verbastelt, aber das liegt an den 
Compilerherstellern, die zu Altlasten kompatibel sein wollen.
Dank Typedef auch kein Problem.

Der zweite Punkt stimmt meiner Meinung auch nicht.
Wer es nicht mag: es führen heute mehr Wege als jemals zuvor an C 
vorbei.
Früher gab es ja wirklich nur Pascal.

von udok (Gast)


Lesenswert?

Klaus W. schrieb:
> Und ich Depp dachte immer, malloc(), printf(), FILE, und wie sie alle
> heißen, würden zu C gehören. Wie naiv!

Der C Standard beinhaltet nicht nur die Sprache sonder auch Standard 
Libs.  Da sind malloc, printf und FILE drinnen.

von udok (Gast)


Lesenswert?

W.S. schrieb:
> Aber die fixed-size-Typen aus stdint gehören zur Sprache.
>
> Nein, sie gehören lediglich zu einer Headerdatei. Und wenn irgendwer
> dazu Lust haben sollte, dann schreibt er eine andere Headerdatei und
> benennt dort eben int in mawin um. Das geht, wäre so auch benutzbar,
> gehört aber nicht zum Sprachumfang.

https://www.open-std.org/jtc1/sc22/WG14/www/docs/n1570.pdf

Seite 217

Natürlich kannst du dir dein eigenes Header File schreiben, und den dazu 
passenden Compiler für deine Sprache gleich dazu...

von MaWin (Gast)


Lesenswert?

udok schrieb:
> - Gute Standard Bibliotheken.

Haha. Ich mag deinen Humor.

von Wilhelm M. (wimalopaan)


Lesenswert?

udok schrieb:
> Stefan ⛄ F. schrieb:
>> Ich denke die meisten sind sich einig: C ist hässlich, aber für uns
>> führt kaum ein Weg daran vorbei.
>
> Ich weiss nicht, ich mag C und finde es sehr elegant.

Ich finde C zwar nicht hässlich, aber es hat für mich zu viele 
Beschränkungen, die Intention exakt auszudrücken. Da ist C++ m.E. 
wesentlich besser.
(Und ich habe das Gefühl, dass Du hier oft als Vergleich C++ und Java 
heranziehst).

> C hat gewaltige Vorteile gegenüber jeder anderen Sprache:
> - EIN einziger Weg zum Ziel (z.B. Nur Pointer, keine Referenzen)

In C++- sind Referenzen non-nullable / non-modifyable, Zeiger als 
abstrakte Referenzen sind nullable und bieten eine 
Iterator-Schnittstelle. Sid also zwei völlig verschiedenen Werkzeuge.

> - Relativ schnell erlernbar, wer will ist je nach Vorwissen in einer
> Woche bis einem Monat dabei.

Nein, das dauert länger. Was dabei dann heraus kommt, sieht man ja hier 
im Forum.

> - Klare Strukturen und geradlinige und lesbare Programme.

Echt jetzt? Wenn ein größeres C Programm klar strukturiert und lesbar 
sein soll, braucht es schon sehr viel Erfahrung. Natürlich gilt dies für 
jede Sprache, allerdings schätze ich die Gefahr bei C hier höher ein.

>   (Die wichtigen Dinge werden linear abgearbeitet und nicht in einer
> virtuellen Klasse in einer dreifach verschachtelten Inline-Funktion
> versteckt, oder in einem Konstruktor wo keiner genau weiss wann der
> aufgerufen wird.

Virtuelle Klasse? Auf welche Sprache beziehst Du Dich?
Dreifach verschachtelte Inline-Funktion? Du steigst also schon aus, wenn 
drei Funktionen geschachtelt aufgerufen werden (Inline hat damit nichts 
zu tun)? Dann solltest Du das Programmieren aufgeben bzw. an dieser 
Stelle hilft nur eine bessere Abstraktion, und da ist C schlecht drin.
In C++ ist es absolut klar, wann ein ctor aufgerufen wird. Oder meinst 
Du den dtor?

> - Keine überladenen Operatoren, wo man nicht weiss was passiert wenn man
> es nicht selber geschrieben hat.

Ja, Operator-Überladung wird oft von Unwissenden missbraucht. Richtig 
eingesetzt ist es aber ein große Hilfe. Und in C++ ist es notwendig, um 
generischen Code schreiben zu können.

> - Einfache Fehlerbehandlung, keine Exceptions die irgendwohin springen.

Das Exceptions kein Allheilmittel sind, hat sich ja mittlerweile 
herumgesprochen. In C++ gibt es dazu ja gute Alternativen.

> - Gute Standard Bibliotheken.

Es gibt genau eine Standard-Bibliothek ;-)

> - Wenig Schreibarbeit und leicht lesbar.

Lesbar? Ich glaube, Du hast noch nicht viel C-Code gesehen.

> - Kleine Versuchung unnötigen Code zu schreiben weil eine "Klasse sonst
> nicht vollständig" ist.

Wer so argumentiert, hat von Software-Engineering keine Ahnung.

>
> Zugegeben ist das Typensystem etwas verbastelt, aber das liegt an den
> Compilerherstellern, die zu Altlasten kompatibel sein wollen.

An den Herstellern? Nein, an der Sprachdefinition.
Das schlechte ist, dass das Typsystem fix und nicht wirklich erweiterbar 
ist.

> Dank Typedef auch kein Problem.

Ist ein Typ-Alias.

> Wer es nicht mag: es führen heute mehr Wege als jemals zuvor an C
> vorbei.

Ja, und das ist vor allem (noch) C++. Man muss in C++ nicht OO machen, 
das ist nur eines der Programmierparadigmen, die C++ unterstützt. Man 
kann sehr gut prozedural bleiben wir in C, aber die Vorteile mitnehmen.

von Stefan F. (Gast)


Lesenswert?

MaWin schrieb:
> So ein Bullenkot.

Man muss dazu wissen, dass W.S. sich gerne sämtliche Header Dateien 
selber neu schreibt, mit ganz vielen magischen Nummern.

von W.S. (Gast)


Lesenswert?

Nano schrieb:
> Ich schätze mal, dass man den Asterisk deswegen genommen hat, weil er
> eben wie in Mathe und Physik in Schriftform am ehesten einem Vektor
> entspricht, der in die Ebene hineinzeigt.

Klingt zwar recht hergeholt, ist aber vielleicht so. Bloß kommt das 
nicht aus Mathe und Physik her, sondern vermutlich aus der 
Elektrotechnik.

Andererseits konnte man bereits damals mit ^ vor- oder nachgestellt 
Zeiger kreieren und damit hantieren. Das ging also bereits damals. Und 
das @ gabs bereits auf jeder englischsprachigen Schreibmaschine. Da 
ausgerechnet das * zu nehmen, war schon ziemlich seltsam.

udok schrieb:
> Natürlich kannst du dir dein eigenes Header File schreiben, und den dazu
> passenden Compiler für deine Sprache gleich dazu...

Ach nö. Schwanz wackelt mit Hund - oder?
Headerdateien können nur Ausdrücke benutzen, die bereits zum 
Sprachumfang gehören. Sie können zwar alternative Bezeichner einführen, 
aber nur deshalb, weil diese eben nur Zweitnamen sind für die bereits 
dem Compiler bekannten Dinge. Na und ein jeder schreibt sich seine 
eigenen Headerdateien, sobald sein Projekt nicht nur eine Datei enthält. 
Das ist die normale Anwendung .

W.S.

von Rolf M. (rmagnus)


Lesenswert?

Wilhelm M. schrieb:
> Wie sinnvoll bspw. folgendes ist, können die C89-Verfechter kaum
> erahnen:
1
> void foo(const char* const*);
2
> void foo(const char* const* const a) {}
3
> void bar(int);
4
> void bar(const int b) {}

Beim Zeigerziel ist das keine Frage, aber den Parameter selbst const zu 
machen - weiß nicht. Der Parameter ist Teil des Interface, aber seine 
constness hat keinerlei Auswirkung auf den Aufrufer.

(prx) A. K. schrieb:
> Die Deklarationssyntax von C wurde von Anfang an verkackt.

Am liebsten wäre mir, wenn es mit dem const umgekehrt wäre, also wenn es 
das Schlüsselwort const gar nicht gäbe, weil alles per Default konstant 
ist und man stattdessen mit einem Schlüsselwort wie z.B. mutable oder 
variable die Konstantheit explizit ausschalten müsste.

Stefan ⛄ F. schrieb:
> Wilhelm M. schrieb:
>> allerdings für jeden Zweck
>> wieder eigene Schlüsselwörter wäre auch nicht gut.
>
> Doch, finde ich schon.

Jedes zusätzliche Schlüsselwort kann halt nirgends mehr als Identifier 
verwendet werden, daher hat man in C versucht, die Zahl der 
Schlüsselwörter möglichst gering zu halten. Das gilt insbesondere für 
nachträglich eingeführte Schlüsselwörter, da diese immer dazu führen, 
dass ein Teil des bestehenden Codes nicht mehr kompatibel ist.

(prx) A. K. schrieb:
> Also statt (ausgeschrieben)
>    array of pointer to const char
>    array of const pointer to char
>    pointer to array of const char
> hat man so Schönheiten wie
>    const char * []
>    char * const []
>    const char (*) []
>
> Also nicht hübsch von links nach rechts gehen, sondern erst einmal
> mitten drin in dem Salat die Stelle finden, bei der man anfängt, und
> dann anhand des Vorrangs teils links teils rechts weiter machen.

Die Richtung ist von rechts nach links. Nur gibt es beim const, das 
normalerweise immer auf das wirkt, was links davon steht, eine 
Besonderheit: Wenn es ganz links steht, wirkt es stattdessen auf das, 
was rechts davon steht. Wenn du also z.B. aus const char * [] ein char 
const * [] machst, dann kommt beim lesen von rechts nach links genau das 
raus, was du oben schreibst. Nur beim letzten Eintrag passt es dann 
nicht mehr.

> Das hing natürlich mit dem Grundfehler in Expressions zusammen, die
> Dereferenzierung davor zu schreiben, die Indizierung jedoch
> dahinter.

Auf die obigen Zeilen wirkt sich das aber auch nur deshalb aus, weil man 
es für eine gute Idee gehalten hat, die Dereferenzierung eines Zeigers 
genauso aussehen zu lassen, wie dessen Deklaration (also mit Sternchen 
vor dem Namen).

W.S. schrieb:
> MaWin schrieb:
>> Aber die fixed-size-Typen aus stdint gehören zur Sprache.
>
> Nein, sie gehören lediglich zu einer Headerdatei.

… zu einem Standard-Header, wie printf() auch.

> Und wenn irgendwer dazu Lust haben sollte, dann schreibt er eine andere
> Headerdatei und benennt dort eben int in mawin um. Das geht, wäre so auch
> benutzbar, gehört aber nicht zum Sprachumfang.

Der Quatsch schon wieder? Ja, wenn man selbst einen Header schreibt, 
gehört der im Gegensatz zu den Standard-Headern nicht zum Umfang des 
Standards. Was hat das jetzt mit stdint.h zu tun?

> Nur mal so als Denkanstoß: Wenn es im Winter kalt ist und du einen
> Mantel trägst, gehört dann der Mantel zu deinen Körperteilen? Er ist
> vermutlich dein Eigentum, aber er ist kein Körperteil von dir, sage ich.

Er erfüllt seinen Zweck. Warum es dabei ein Problem sein soll, dass er 
kein Körperteil ist, erschließt sich mir nicht.

von Oliver S. (oliverso)


Lesenswert?

Rolf M. schrieb:
> Am liebsten wäre mir, wenn es mit dem const umgekehrt wäre, also wenn es
> das Schlüsselwort const gar nicht gäbe, weil alles per Default konstant
> ist und man stattdessen mit einem Schlüsselwort wie z.B. mutable oder
> variable die Konstantheit explizit ausschalten müsste.

Mir wäre es am liebsten, wenn die Sonne im Westen aufginge...

C ist nun mal C. Keiner behauptet, daß das die konzeptuell beste, 
logischste und fehlerfreiste Programmiersprache aller Zeiten ist. Ist es 
nicht, und wird es auch nie sein.

Wer es nicht braucht, nimmt was anders. Wer es nicht mag, nimmt was 
anderes, wenn er kann. Wer es nutzen muß, sollte sich damit arrangieren, 
oder eine neue Programmiersprache schaffen und etablieren, die alles 
besser kann und macht.

Oliver

von Zeno (Gast)


Lesenswert?

Nano schrieb:
> Ich schätze mal, dass man den Asterisk deswegen genommen hat, weil er
> eben wie in Mathe und Physik in Schriftform am ehesten einem Vektor
> entspricht, der in die Ebene hineinzeigt.
Nö da werden Vektoren mit lateinischen Buchstaben und einem Pfeil 
darüber oder mit altdeutschen Buchstaben in Schreibschrift dargestellt. 
Beim wird ein in die Zeichenebene zeigender Vektor durch ein Kreuz 
dargestellt (so wie es eben aussieht, wenn auf einen Pfeil von hinten 
schaut).
Asterisk kenne ich in diesem Zusammenhang nicht. Kann natürlich sein das 
man im angelsächsischen da mit dem Asterisk hantiert.

von Rolf M. (rmagnus)


Lesenswert?

Oliver S. schrieb:
> Mir wäre es am liebsten, wenn die Sonne im Westen aufginge...
>
> C ist nun mal C.

<Loriot>Ach…</Loriot>

> Wer es nicht braucht, nimmt was anders. Wer es nicht mag, nimmt was
> anderes, wenn er kann.

Ich kann mit C gut leben. Dennoch kann ich doch in einer Diskussion 
sagen, wenn mir bestimmte Dinge anders lieber gewesen wären. Und das mit 
dem "umgedrehten const" macht im übrigen keine mir bekannte Sprache. 
Viele Sprachen scheitern ja schon an dem generellen Konzept von 
const-correctness, das ich durchaus wichtig finde.

> Wer es nutzen muß, sollte sich damit arrangieren, oder eine neue
> Programmiersprache schaffen und etablieren, die alles besser kann und
> macht.

Das haben schon so viele gemacht. Deshalb gibt es jetzt eine 
unüberschaubare Anzahl von Programmiersprachen. Die eine perfekte "one 
language to rule them all" ist dennoch nicht dabei.

Zeno schrieb:
> Beim wird ein in die Zeichenebene zeigender Vektor durch ein Kreuz
> dargestellt (so wie es eben aussieht, wenn auf einen Pfeil von hinten
> schaut).

Nur gab es früher so ein Kreuz in den Zeichensätzen nicht, wenn man mal 
vom x absieht. Also hat man eben das genommen, was da am nächsten dran 
kommt.

: Bearbeitet durch User
von Wilhelm M. (wimalopaan)


Lesenswert?

Rolf M. schrieb:
> Wilhelm M. schrieb:
>> Wie sinnvoll bspw. folgendes ist, können die C89-Verfechter kaum
>> erahnen:> void foo(const char* const*);
>> void foo(const char* const* const a) {}
>> void bar(int);
>> void bar(const int b) {}
>
> Beim Zeigerziel ist das keine Frage, aber den Parameter selbst const zu
> machen - weiß nicht. Der Parameter ist Teil des Interface, aber seine
> constness hat keinerlei Auswirkung auf den Aufrufer.

Richtig, die zusätzliche const-Qualifizierung wirkt nicht auf den 
Caller, aber eben im Callee: genau wie lokale Variablen read-only sein 
sollten, um einen schleichenden Bedeutungswechsel (oder ungewolltes 
Ändern) zu verhindern, ist das bei Parametervariablen um so wichtiger: 
denn diese sind "ganz oben" in der Signatur deklariert und können bspw. 
nicht in einem lokalen Block nach bei Ihrer Verwendung deklariert 
werden. Daher können Bedeutungswechsel durch eine Modifikation 
unentdeckt bleiben. Das ist eine (häufige) Fehlerquelle.

Rolf M. schrieb:
> Am liebsten wäre mir, wenn es mit dem const umgekehrt wäre, also wenn es
> das Schlüsselwort const gar nicht gäbe, weil alles per Default konstant
> ist und man stattdessen mit einem Schlüsselwort wie z.B. mutable oder
> variable die Konstantheit explizit ausschalten müsste.

Richtig. Und das gilt eben für Parametervariablen genauso: s.o.

: Bearbeitet durch User
von Wilhelm M. (wimalopaan)


Lesenswert?

Oliver S. schrieb:
> Rolf M. schrieb:
>> Am liebsten wäre mir, wenn es mit dem const umgekehrt wäre, also wenn es
>> das Schlüsselwort const gar nicht gäbe, weil alles per Default konstant
>> ist und man stattdessen mit einem Schlüsselwort wie z.B. mutable oder
>> variable die Konstantheit explizit ausschalten müsste.
>
> Mir wäre es am liebsten, wenn die Sonne im Westen aufginge...

Da fehlt noch, das alle einstellig verwendbaren Konstruktoren 'explicit' 
seon sollten (autsch, das war jetzt wieder C++).

von Wilhelm M. (wimalopaan)


Lesenswert?

Oliver S. schrieb:
> C ist nun mal C. Keiner behauptet, daß das die konzeptuell beste,
> logischste und fehlerfreiste Programmiersprache aller Zeiten ist. Ist es
> nicht, und wird es auch nie sein.

Mit C++ sind aber schon einige Verbesserungen eingezogen. Deswegen ist 
ja meine Empfehlung, die zu nutzen, indem man einfach einen C++-Compiler 
benutzt. Das hat für 90% des C-Codes keine Auswirkungen. Dann kann man 
beim prozeduralen Code bleiben (kein OOP, keine Generizität, ...) und 
hat trotzdem ein paar Vorteile, ohne das es sich in eine ganz andere 
Richtung entwickelt.

von MaWin (Gast)


Lesenswert?

Rolf M. schrieb:
> Und das mit
> dem "umgedrehten const" macht im übrigen keine mir bekannte Sprache.

In Rust sind alle Variablen immutable (const), wenn sie nicht explizit 
als mut (mutable) definiert wurden.

Das funktioniert erstaunlich gut. Vor allem, weil Rust Sprachkonstrukte 
bietet, die immutable-Variablen (ja, komisches Wort) fördern.

Die Rust-Syntax ist sehr C-like. Das macht den Umstieg etwas leichter.
Es gibt natürlich einige Spracheigenschaften, die man als langjähriger 
C-Programmierer erst komisch oder als falsch empfindet. Erst später 
erkennt man den Nutzen. Das ging mir zum Beispiel bei 'return' so. In 
Rust gibt jedes Statement einen Wert zurück. Deshalb braucht man am Ende 
von Funktionen kein return hinzuschreiben. (Man kann es aber, wenn man 
es will).

von Wilhelm M. (wimalopaan)


Lesenswert?

MaWin schrieb:
> Rolf M. schrieb:
>> Und das mit
>> dem "umgedrehten const" macht im übrigen keine mir bekannte Sprache.
>
> In Rust sind alle Variablen immutable (const), wenn sie nicht explizit
> als mut (mutable) definiert wurden.

Ja, und das ist sehr gut (s.o. dazu meine Erklärung).

> Das funktioniert erstaunlich gut. Vor allem, weil Rust Sprachkonstrukte
> bietet, die immutable-Variablen (ja, komisches Wort) fördern.

Der Name Variable wird eben von vielen Leuten falsch als eine 
"mathematische" Variable verstanden. Das ist natürlich falsch, denn es 
sind in der SW-Technik keine Platzhalter sondern "benannte Objekte".

von Zeno (Gast)


Lesenswert?

Rolf M. schrieb:
> Zeno schrieb:
>> Beim wird ein in die Zeichenebene zeigender Vektor durch ein Kreuz
>> dargestellt (so wie es eben aussieht, wenn auf einen Pfeil von hinten
>> schaut).
>
> Nur gab es früher so ein Kreuz in den Zeichensätzen nicht, wenn man mal
> vom x absieht. Also hat man eben das genommen, was da am nächsten dran
> kommt.
Ne der W.S. hat's im Prinzip schon korrigiert. Wenn, dann kommt das mit 
dem Pfeil aus der E-Technik. Da lag ich falsch, daß ich das in die 
Mathematik/Physik verortet habe. Dort gibt es das eigenlich gar nicht.
Ist aber am Ende auch egal der Asterisk als Kennzeichnung für einen 
Zeiger ist noch eines der kleineren Übel bei C.

von Wilhelm M. (wimalopaan)


Lesenswert?

Wilhelm M. schrieb:
> Oliver S. schrieb:
>> Rolf M. schrieb:
>>> Am liebsten wäre mir, wenn es mit dem const umgekehrt wäre, also wenn es
>>> das Schlüsselwort const gar nicht gäbe, weil alles per Default konstant
>>> ist und man stattdessen mit einem Schlüsselwort wie z.B. mutable oder
>>> variable die Konstantheit explizit ausschalten müsste.
>>
>> Mir wäre es am liebsten, wenn die Sonne im Westen aufginge...
>
> Da fehlt noch, das alle einstellig verwendbaren Konstruktoren 'explicit'
> seon sollten (autsch, das war jetzt wieder C++).

Dazu gehört natürlich auch, dass es bei primitiven DT keine impliziten 
einengenden Typwandlungen geben sollte.

von Oliver S. (oliverso)


Lesenswert?

Rolf M. schrieb:
>> Wer es nutzen muß, sollte sich damit arrangieren, oder eine neue
>> Programmiersprache schaffen und etablieren, die alles besser kann und
>> macht.
>
> Das haben schon so viele gemacht. Deshalb gibt es jetzt eine
> unüberschaubare Anzahl von Programmiersprachen. Die eine perfekte "one
> language to rule them all" ist dennoch nicht dabei.

<Loriot>Ach…</Loriot>

;)

Oliver

von Rolf M. (rmagnus)


Lesenswert?

Wilhelm M. schrieb:
> Richtig, die zusätzliche const-Qualifizierung wirkt nicht auf den
> Caller, aber eben im Callee:

Die Parameterliste ist aber eine Vereinbarung zwischen beiden. Daher 
sollte dort nur das stehen, was auch für beide relevant ist.

Wilhelm M. schrieb:
> Der Name Variable wird eben von vielen Leuten falsch als eine
> "mathematische" Variable verstanden.

Du meinst als etwas, das gerade nicht wie eine mathematische Variable 
ist. In einem mathematischen Gleichungssystem können sich die Werte von 
Variablen auch nicht ändern, da es auch im Gegensatz zu einem Programm 
keine sequenzielle Ausführung gibt, durch die sich z.B. in der dritten 
Zeile ein Variablenwert ändern könnte.
Das ist übrigens auch in der Programmierung nicht unbedingt immer so. Es 
gibt durchaus Programmier-Paradigmen, in denen sich die Variablen eher 
wie mathematische Variablen verhalten, z.B. in der funktionalen 
Programmierung. Da arbeiten auch Funktionen eher so, wie man sie aus der 
Mathematik kennt.

Wilhelm M. schrieb:
> Da fehlt noch, das alle einstellig verwendbaren Konstruktoren 'explicit'
> seon sollten (autsch, das war jetzt wieder C++).

Ja, es wäre besser, wenn man Konvertierkonstruktoren explizit ("no pun 
intended") als solche kennzeichnen müsste.

Wilhelm M. schrieb:
> Dazu gehört natürlich auch, dass es bei primitiven DT keine impliziten
> einengenden Typwandlungen geben sollte.

Das finde ich nun wieder schwierig. Da die Datentypen keine feste Größe 
haben, kann sehr vieles potenziell einengend sein. So sagt mein GCC 
beispielsweise bei folgendem C++-Code:
1
void func(char param)
2
{
3
    long double d { param };
4
    // ...
5
}
warning: narrowing conversion of ‘param’ from ‘char’ to ‘long double’

Oliver S. schrieb:
> <Loriot>Ach…</Loriot>

😀

: Bearbeitet durch User
von Wilhelm M. (wimalopaan)


Lesenswert?

Rolf M. schrieb:
> Wilhelm M. schrieb:
>> Richtig, die zusätzliche const-Qualifizierung wirkt nicht auf den
>> Caller, aber eben im Callee:
>
> Die Parameterliste ist aber eine Vereinbarung zwischen beiden. Daher
> sollte dort nur das stehen, was auch für beide relevant ist.

Beachte, dass in meinem Beispiel die Deklaration und Definition 
unterschiedlich sind. Es ist dort genau der relevante Unterschied 
eingefügt.

von MaWin (Gast)


Lesenswert?

Rolf M. schrieb:
> Die Parameterliste ist aber eine Vereinbarung zwischen beiden. Daher
> sollte dort nur das stehen, was auch für beide relevant ist.

Nein. Nicht alle Eigenschaften der Parameterliste sind Teil dieser 
Vereinbarung.
So sind zum Beispiel auch die Parameternamen nicht Teil der technischen 
Schnittstelle. Ja, ich weiß, dass man die in der Deklaration weglassen 
kann. Was aber nicht sinnvoll ist.

Im Vergleich dazu ist der (umgekehrte) Fall in Rust mit mut (= 
nicht-const) auch kein Teil der Schnittstellenvereinbarung.

Wenn du das nicht magst, zwingt dich aber niemand es anders zu machen.

von (prx) A. K. (prx)


Lesenswert?

W.S. schrieb:
> Andererseits konnte man bereits damals mit ^ vor- oder nachgestellt
> Zeiger kreieren und damit hantieren. Das ging also bereits damals.

Mit ^ dahinter hätte man das Problem nicht mit der Multiplikation 
gehabt, dafür aber mit XOR ^ - das gibts in Pascal ja nicht. Also 
gleiches Problem, irgendwo hätte es ein anderes Symbol gebraucht.

von (prx) A. K. (prx)


Lesenswert?

Rolf M. schrieb:
> Am liebsten wäre mir, wenn es mit dem const umgekehrt wäre, also wenn es
> das Schlüsselwort const gar nicht gäbe, weil alles per Default konstant
> ist und man stattdessen mit einem Schlüsselwort wie z.B. mutable oder
> variable die Konstantheit explizit ausschalten müsste.

Das liess sich aber aufgrund der heiligen Kuh in C89 nicht mehr machen.

von MaWin (Gast)


Lesenswert?

Rolf M. schrieb:
> In einem mathematischen Gleichungssystem können sich die Werte von
> Variablen auch nicht ändern

In einer Summen- oder Produktformel ändert sich der Wert der 
Zählvariable.

von Wilhelm M. (wimalopaan)


Lesenswert?

MaWin schrieb:
> Rolf M. schrieb:
>> Die Parameterliste ist aber eine Vereinbarung zwischen beiden. Daher
>> sollte dort nur das stehen, was auch für beide relevant ist.
>
> Nein. Nicht alle Eigenschaften der Parameterliste sind Teil dieser
> Vereinbarung.
> So sind zum Beispiel auch die Parameternamen nicht Teil der technischen
> Schnittstelle.

Genau aus dem Grunde habe ich sie ja oben auch weggelassen: der Name des 
Parameters hat keine syntaktische / typspezifische Bedeutung für den 
Aufrufer. Die Semantik kann der Compiler eh nicht prüfen, daher darf man 
den Namen auch weglassen.

von (prx) A. K. (prx)


Lesenswert?

Rolf M. schrieb:
> Die Richtung ist von rechts nach links.

Eher von innen nach aussen.
1
  char *p[]
2
        ^    hier gehts los          p ist
3
         ^   [] hat Vorrang          array of
4
       ^     erst dann kommt dies    pointer
5
  ^                                  to char

von MaWin (Gast)


Lesenswert?

Wilhelm M. schrieb:
> Genau aus dem Grunde habe ich sie ja oben auch weggelassen: der Name des
> Parameters hat keine syntaktische / typspezifische Bedeutung für den
> Aufrufer. Die Semantik kann der Compiler eh nicht prüfen, daher darf man
> den Namen auch weglassen.

Ja. Aber sinnvoll ist es halt trotzdem nicht, weil die Namen der 
Dokumentation und dem Verständnis dienen.

int funktion(char *, int *, int, int, int);

Da weiß kein Mensch, welcher Parameter jetzt wohin kommt.
Und ohne Benennung, hat man auch Schwierigkeiten das in der 
Dokumentation zu beschreiben. Da bleiben nur Krücken wie "als vierten 
Parameter wird XYZ übergeben...".

von Wilhelm M. (wimalopaan)


Lesenswert?

MaWin schrieb:
> Wilhelm M. schrieb:
>> Genau aus dem Grunde habe ich sie ja oben auch weggelassen: der Name des
>> Parameters hat keine syntaktische / typspezifische Bedeutung für den
>> Aufrufer. Die Semantik kann der Compiler eh nicht prüfen, daher darf man
>> den Namen auch weglassen.
>
> Ja. Aber sinnvoll ist es halt trotzdem nicht, weil die Namen der
> Dokumentation und dem Verständnis dienen.
>
> int funktion(char *, int *, int, int, int);
>
> Da weiß kein Mensch, welcher Parameter jetzt wohin kommt.
> Und ohne Benennung, hat man auch Schwierigkeiten das in der
> Dokumentation zu beschreiben. Da bleiben nur Krücken wie "als vierten
> Parameter wird XYZ übergeben...".

Schönes Beispiel wie man es eben nicht machen soll: mehrstellige 
Funktion mit Parametern desselben Typs sind immer schlecht.
Die Bedeutung des Argumentes einer Funktion muss eindeutig aus dem Namen 
der Funktion und dem Typ des Parameters hervorgehen, nicht aus dem Namen 
des Parameters.

von MaWin O. (mawin_original)


Lesenswert?

(prx) A. K. schrieb:
> Eher von innen nach aussen.
>   char *p[]

Das System ist halt völlig unintuitiv.
1
char (*p)[]

ist ein Pointer auf ein Array. Und nicht wie ich es intuitiv lesen würde 
ein Array von Pointern.

Das C-Typsystem ist völlig kaputt. An allen Ecken und Enden. Das endet 
nicht bei der Syntax.

von (prx) A. K. (prx)


Lesenswert?

Wilhelm M. schrieb:
> Die Bedeutung des Argumentes einer Funktion muss eindeutig aus dem Namen
> der Funktion und dem Typ des Parameters hervorgehen

Interessante Idee, wirkt auf mich aber ein wenig bizarr.

von MaWin O. (mawin_original)


Lesenswert?

Wilhelm M. schrieb:
> Schönes Beispiel wie man es eben nicht machen soll: mehrstellige
> Funktion mit Parametern desselben Typs sind immer schlecht.
> Die Bedeutung des Argumentes einer Funktion muss eindeutig aus dem Namen
> der Funktion und dem Typ des Parameters hervorgehen, nicht aus dem Namen
> des Parameters.

Ja. In einer idealen Welt. Die bricht aber schon zusammen, wenn deine 
Funktion zwei Parameter hat.

von Stefan F. (Gast)


Lesenswert?

Ich bin still geworden, aber ich lese noch mit. Das sind einige 
interessante Sachen bei, die ich noch nicht kannte bzw. noch nie drüber 
nachgedacht habe.

von Wilhelm M. (wimalopaan)


Lesenswert?

(prx) A. K. schrieb:
> Wilhelm M. schrieb:
>> Die Bedeutung des Argumentes einer Funktion muss eindeutig aus dem Namen
>> der Funktion und dem Typ des Parameters hervorgehen
>
> Interessante Idee, wirkt auf mich aber ein wenig bizarr.

Bizarr? Ich bin ziemlich sicher, dass es in den Cpp-Core-Guidelines 
steht, wenn gleich diese Regel schon wirklich sehr alt ist.

von (prx) A. K. (prx)


Lesenswert?

MaWin O. schrieb:
> Das System ist halt völlig unintuitiv.
> char (*p)[]
>
> ist ein Pointer auf ein Array. Und nicht wie ich es intuitiv lesen würde
> ein Array von Pointern.
1
  char (*p)[]
2
         ^    hier gehts los          p ist
3
       ^      () hat Vorrang vor []   
4
        ^                             pointer
5
           ^                          to array
6
   ^                                  of char

Ist völlig logisch, vorausgesetzt man denkt wie ein Parser, nicht wie 
ein Mensch. ;-)

von Wilhelm M. (wimalopaan)


Lesenswert?

MaWin O. schrieb:
> Wilhelm M. schrieb:
>> Schönes Beispiel wie man es eben nicht machen soll: mehrstellige
>> Funktion mit Parametern desselben Typs sind immer schlecht.
>> Die Bedeutung des Argumentes einer Funktion muss eindeutig aus dem Namen
>> der Funktion und dem Typ des Parameters hervorgehen, nicht aus dem Namen
>> des Parameters.
>
> Ja. In einer idealen Welt. Die bricht aber schon zusammen, wenn deine
> Funktion zwei Parameter hat.

Natürlich nicht.
Der Klassiker ist doch
1
Date d{2, 1, 2012};

Besser:
1
Date d{Month{2}, Day{1}, Year{2012}}

Dann kann man auch eine permutierte Schnittstelle anbieten und es bleibt 
eindeutig:
1
Date d{Day{1}, Month{2}, Year{2012}}
2
// ... weitere Permutationen
Aber das sind doch eigentlich alte Hüte.

von Wilhelm M. (wimalopaan)


Lesenswert?

Stefan ⛄ F. schrieb:
> Ich bin still geworden, aber ich lese noch mit. Das sind einige
> interessante Sachen bei, die ich noch nicht kannte bzw. noch nie drüber
> nachgedacht habe.

Da bist Du einer der wenigen, die bei so einer Abdrift noch dabei sind 
;-)

von (prx) A. K. (prx)


Lesenswert?

Wilhelm M. schrieb:
> Bizarr? Ich bin ziemlich sicher, dass es in den Cpp-Core-Guidelines
> steht, wenn gleich diese Regel schon wirklich sehr alt ist.

Kann man in C++ auf Objekte machen, wenn man komplexe Funktionen mit 
etlichen Parametern in einzelne Methoden aufsplittet, die irgendwas im 
Objekt modifizieren, und erst dann die Aktion startet.

In C geht das mangels Objekten nicht so ohne weiteres.

von Rolf M. (rmagnus)


Lesenswert?

Wilhelm M. schrieb:
> (prx) A. K. schrieb:
>> Wilhelm M. schrieb:
>>> Die Bedeutung des Argumentes einer Funktion muss eindeutig aus dem Namen
>>> der Funktion und dem Typ des Parameters hervorgehen
>>
>> Interessante Idee, wirkt auf mich aber ein wenig bizarr.

Finde ich auch. Wie macht man dann sowas:
1
void setColor(uint8_t r, uint8_t g, uint8_t b, uint8_t alpha);
Oder ähnlich bei einem Vektor mit x-, y- und z-Koordinate?

> Bizarr? Ich bin ziemlich sicher, dass es in den Cpp-Core-Guidelines
> steht, wenn gleich diese Regel schon wirklich sehr alt ist.

Hmm, dafür wird davon aber in der Standardbibliothek ziemlich häufig 
abgewichen. Wahlfrei rausgegriffenes Beispiel:
1
std::string& std::string::insert(size_t, const string&, size_t, size_t);

von Wilhelm M. (wimalopaan)


Lesenswert?

(prx) A. K. schrieb:
> Wilhelm M. schrieb:
>> Bizarr? Ich bin ziemlich sicher, dass es in den Cpp-Core-Guidelines
>> steht, wenn gleich diese Regel schon wirklich sehr alt ist.
>
> Kann man in C++ auf Objekte machen, wenn man komplexe Funktionen mit
> etlichen Parametern in einzelne Methoden aufsplittet, die irgendwas im
> Objekt modifizieren, und erst dann die Aktion startet.

Nein, das Chaining (oder named-parameter-idiom) ist hier gar nicht 
gemeint. Es geht einfach um unterschiedliche Typen in der 
Parameterliste.

Aber Du hast schon Recht: ein weiterer Punkt der C fehlt ist eben 
Funktionsüberladung. Ich wiederhole mich: benutzt C++ auch dort, wo 
normalerweise C benutzt wird, und profitiert von den kleinen Goodies.

von Daniel A. (daniel-a)


Lesenswert?

1
struct my_fancy_function_params {
2
  int year;
3
  int month;
4
  int day;
5
};
6
7
void s_my_fancy_function(const struct my_fancy_function_params*const params);
8
#define my_fancy_function(...) s_my_fancy_function(&(struct my_fancy_function_params){__VA_ARGS__})
9
10
...
11
12
{
13
  my_fancy_function(.year=2022, .month=05, .day=27);
14
}

von Wilhelm M. (wimalopaan)


Lesenswert?

Rolf M. schrieb:
> Wilhelm M. schrieb:
>> (prx) A. K. schrieb:
>>> Wilhelm M. schrieb:
>>>> Die Bedeutung des Argumentes einer Funktion muss eindeutig aus dem Namen
>>>> der Funktion und dem Typ des Parameters hervorgehen
>>>
>>> Interessante Idee, wirkt auf mich aber ein wenig bizarr.
>
> Finde ich auch. Wie macht man dann sowas:
>
1
> void setColor(uint8_t r, uint8_t g, uint8_t b, uint8_t alpha);
2
>
1
void setColor(Red, Green, Blue, Alpha);

> Hmm, dafür wird davon aber in der Standardbibliothek ziemlich häufig
> abgewichen. Wahlfrei rausgegriffenes Beispiel:
>
1
> std::string& std::string::insert(size_t, const string&, size_t, size_t);
2
>

Ja, leider. Auch in der cppstdlib gibt es (Jugend)-Sünden. Das betrifft 
auch die Schnittstelle von std::vector<>.

von Daniel A. (daniel-a)


Lesenswert?

(prx) A. K. schrieb:
> Kann man in C++ auf Objekte machen, wenn man komplexe Funktionen mit
> etlichen Parametern in einzelne Methoden aufsplittet, die irgendwas im
> Objekt modifizieren, und erst dann die Aktion startet.
>
> In C geht das mangels Objekten nicht so ohne weiteres.

Einfach ein strukt uns stink normale Funktionen nehmen. Funktioniert 
einwandfrei.

von Wilhelm M. (wimalopaan)


Lesenswert?

Daniel A. schrieb:
> (prx) A. K. schrieb:
>> Kann man in C++ auf Objekte machen, wenn man komplexe Funktionen mit
>> etlichen Parametern in einzelne Methoden aufsplittet, die irgendwas im
>> Objekt modifizieren, und erst dann die Aktion startet.
>>
>> In C geht das mangels Objekten nicht so ohne weiteres.
>
> Einfach ein strukt uns stink normale Funktionen nehmen. Funktioniert
> einwandfrei.

Ja, wie ich oben sagte.
Allerdings meint er glaube ich eher sowas wie das named-parameter-idiom:
1
A a{}.name("bla").color("red").kind("bla");

: Bearbeitet durch User
von (prx) A. K. (prx)


Lesenswert?

Wilhelm M. schrieb:
> Es geht einfach um unterschiedliche Typen in der
> Parameterliste.

Wie wärs mit einem Beispiel für C89, in dem in einer traditionellen 
Implementierung einer Funktion je ein Wert für Rot, Grün und Blau 
vorkommt. Erleichtert das Verständnis. Mit etwas Fokus auf jene Zeit, in 
der C entstand, nicht 2022.

von (prx) A. K. (prx)


Lesenswert?

Daniel A. schrieb:
> Einfach ein strukt uns stink normale Funktionen nehmen. Funktioniert
> einwandfrei.

Also C++ zu Fuss.

von MaWin O. (mawin_original)


Lesenswert?

Wilhelm M. schrieb:
> Natürlich nicht.
> Der Klassiker ist dochDate d{2, 1, 2012};

Keine Ahnung was das ist. Jedenfalls kein C.

von Wilhelm M. (wimalopaan)


Lesenswert?

(prx) A. K. schrieb:
> Daniel A. schrieb:
>> Einfach ein strukt uns stink normale Funktionen nehmen. Funktioniert
>> einwandfrei.
>
> Also C++ zu Fuss.

Genau. Deswegen ja mein Rat: nimm gleich C++ und profitiere von den 
Goodies.

Beitrag #7078361 wurde vom Autor gelöscht.
von Wilhelm M. (wimalopaan)


Lesenswert?

MaWin O. schrieb:
> Wilhelm M. schrieb:
>> Natürlich nicht.
>> Der Klassiker ist dochDate d{2, 1, 2012};
>
> Keine Ahnung was das ist. Jedenfalls kein C.

Sorry, C kann keine uniform-initialisation:
1
Date d = {1, 2, 2012};

Wieder ein Punkt für die kleinen Goodies von C++.

: Bearbeitet durch User
von Daniel A. (daniel-a)


Lesenswert?

Einfach die designated initializer nutzen.

von Oliver S. (oliverso)


Lesenswert?

Wilhelm M. schrieb:
> Wieder ein Punkt für die kleinen Goodies von C++.

Du meinst sicher die wunderbaren Vorzüge der uniform Initialization wie 
in
1
std::vector<int>{3}

Oliver

von Wilhelm M. (wimalopaan)


Lesenswert?

Oliver S. schrieb:
> Wilhelm M. schrieb:
>> Wieder ein Punkt für die kleinen Goodies von C++.
>
> Du meinst sicher die wunderbaren Vorzüge der uniform Initialization wie
> in
>
>
1
std::vector<int>{3}
>
> Oliver

Ja, steht doch so oben ... (???)

von Nano (Gast)


Lesenswert?

Wilhelm M. schrieb:
> udok schrieb:>
>> Wer es nicht mag: es führen heute mehr Wege als jemals zuvor an C
>> vorbei.
>
> Ja, und das ist vor allem (noch) C++.

Nach und nach wird C++ in dieser Rolle meiner Meinung nach von Rust 
verdrängt.
In 10 Jahren dürfte Rust bei neuen Projekten gegenüber C++ vorgezogen 
werden. Momentan hat C++ noch einen Vorteil beim Drumherum und der 
Anzahl an Leuten die es können.

Der Altbestand an SW bleibt natürlich in C++, das ist klar.

von Nano (Gast)


Lesenswert?

W.S. schrieb:
> Nano schrieb:
>> Ich schätze mal, dass man den Asterisk deswegen genommen hat, weil er
>> eben wie in Mathe und Physik in Schriftform am ehesten einem Vektor
>> entspricht, der in die Ebene hineinzeigt.
>
> Klingt zwar recht hergeholt, ist aber vielleicht so. Bloß kommt das
> nicht aus Mathe und Physik her, sondern vermutlich aus der
> Elektrotechnik.

Magnetismus und elektrische Felder sind ein Teil, den man in Physik 
lernt und da wird das dann häufig benutzt wenn ein Vektor in die 
Tafel/Papierebene hineinzeigen soll.

Da es hier zwischen der Physik und Elektrotechnik Überschneidungen gibt, 
hat die das natürlich auch.

> Andererseits konnte man bereits damals mit ^ vor- oder nachgestellt
> Zeiger kreieren und damit hantieren.

'^' braucht man auch für den Exponenten, damit wäre nichts gewonnen.

> Und
> das @ gabs bereits auf jeder englischsprachigen Schreibmaschine.

Ja, aber im Rest der Welt war es eher unüblich.
Und dann wurde es früher im englischsprachigen Raum laut WP als 
kaufmännisches Zeichen als Ersetz für "zu je" benutzt.
Da besteht also gar kein Zusammenhang zu einem Zeiger.

So gesehen hätte man also genauso gut auch jedes beliebige andere 
Zeichen für den Zeiger nehmen können.

von Chris (Gast)


Lesenswert?

Ich habe einen C compiler, fuer embedded. Was wuerdet ihr da empfehlen 
was von c89 hinausgeht.
Decl ala statement habe ich mir schon mehrmals gedacht, wegen debugging 
und variabile scope/aliasing habe ich dies noch gelassen.

von Nano (Gast)


Lesenswert?

Zeno schrieb:
> Nano schrieb:
>> Ich schätze mal, dass man den Asterisk deswegen genommen hat, weil er
>> eben wie in Mathe und Physik in Schriftform am ehesten einem Vektor
>> entspricht, der in die Ebene hineinzeigt.
> Nö da werden Vektoren mit lateinischen Buchstaben und einem Pfeil
> darüber oder mit altdeutschen Buchstaben in Schreibschrift dargestellt.
> Beim wird ein in die Zeichenebene zeigender Vektor durch ein Kreuz
> dargestellt (so wie es eben aussieht, wenn auf einen Pfeil von hinten
> schaut).
> Asterisk kenne ich in diesem Zusammenhang nicht. Kann natürlich sein das
> man im angelsächsischen da mit dem Asterisk hantiert.

Der Asterisk steht für den Punkt und für den Punkt nimmt man in der 
Zeichenebene ein x. Es ist aber so, dass man hier zwei Varianten hat, 
die, die in die Zeichenebene hineinragt und die, die aus der 
Zeichenebene herausragt.
Das x ist ist für das hineinzeigen vergeben, weswegen man für das 
herauszeigen einen Punkt nimmt.
Siehe:
http://www.dieter-heidorn.de/Physik/SS/K07_Magnetisches%20Feld/K2_Flussdichte/K2_Flussdichte.html

Beim Programmieren braucht man das x aber für die Bezeichnernamen und 
der Punkt ist viel zu klein, als dass der groß auffällt.
Der Asterisk ist hier somit als Ersatz für den Punkt, so wie bei der 
Multiplikation auch, also durchaus passend, wenn da nicht die 
Möglichkeit des Konflikts mit der Multiplikation stehen würde.
Es ist gut möglich, dass man daran anfangs nicht gedacht hat oder 
dachte, dass man das ausreichend gut umschiffen könnte.

von Nano (Gast)


Lesenswert?

Rolf M. schrieb:
>> Wer es nicht braucht, nimmt was anders. Wer es nicht mag, nimmt was
>> anderes, wenn er kann.
>
> Ich kann mit C gut leben. Dennoch kann ich doch in einer Diskussion
> sagen, wenn mir bestimmte Dinge anders lieber gewesen wären. Und das mit
> dem "umgedrehten const" macht im übrigen keine mir bekannte Sprache.

Rust macht es so.

"Variables in Rust are immutable by default, and require the mut keyword 
to be made mutable."
https://doc.rust-lang.org/std/keyword.let.html

> Das haben schon so viele gemacht. Deshalb gibt es jetzt eine
> unüberschaubare Anzahl von Programmiersprachen. Die eine perfekte "one
> language to rule them all" ist dennoch nicht dabei.

Rust ist durchaus eine gute Alternative zu C und C++.

von Nano (Gast)


Lesenswert?

Zeno schrieb:
> Rolf M. schrieb:
>> Zeno schrieb:
>>> Beim wird ein in die Zeichenebene zeigender Vektor durch ein Kreuz
>>> dargestellt (so wie es eben aussieht, wenn auf einen Pfeil von hinten
>>> schaut).
>>
>> Nur gab es früher so ein Kreuz in den Zeichensätzen nicht, wenn man mal
>> vom x absieht. Also hat man eben das genommen, was da am nächsten dran
>> kommt.
> Ne der W.S. hat's im Prinzip schon korrigiert. Wenn, dann kommt das mit
> dem Pfeil aus der E-Technik. Da lag ich falsch, daß ich das in die
> Mathematik/Physik verortet habe. Dort gibt es das eigenlich gar nicht.

Schonmal Feldlinien in Physik gezeichnet?
Also ich schon.

> Ist aber am Ende auch egal der Asterisk als Kennzeichnung für einen
> Zeiger ist noch eines der kleineren Übel bei C.

Ein anderes Übel von C ist implizites Fall-Through Verhalten bei Switch 
Anweisungen.
Hier gibt's nen Artikel dazu:
https://lwn.net/Articles/794944/

von Zeno (Gast)


Lesenswert?

(prx) A. K. schrieb:
> dafür aber mit XOR ^ - das gibts in Pascal ja nicht.
Wo haste denn das her? Na klar gibt es XOR in Pascal, da heißt es, wer 
hätte das gedacht, XOR.

von (prx) A. K. (prx)


Lesenswert?

Zeno schrieb:
> (prx) A. K. schrieb:
>> dafür aber mit XOR ^ - das gibts in Pascal ja nicht.
> Wo haste denn das her?

Guck nochmal hin, was ich schrieb. Das ^ war kein Tippfehler.

von Stefan F. (Gast)


Lesenswert?

Nano schrieb:
> Ein anderes Übel von C ist implizites Fall-Through Verhalten bei Switch
> Anweisungen.

Da muss man einfach so denken, wie die C Erfinder. Die case sind nicht 
eine Liste von alternativen Bedingungen sondern switch springt zu einer 
bestimmten Stelle innerhalb einer Liste von Befehlen. Unterhalb von 
Switch kommt nur ein einziger Code Block. Case definieren keine Blöcke, 
sondern Sprungziele.

In Go haben sie das geändert, da fallen die case nicht implizit durch.

von Zeno (Gast)


Lesenswert?

Nano schrieb:
> Schonmal Feldlinien in Physik gezeichnet?
Ja sicher und in Theorethischer Elektrotechnik und in Feldtheorie auch, 
da kam aber kein Asterisk vor. Das war entweder x oder . evtl noch mit 
einem Kringel drum herum.

Nano schrieb:
> '^' braucht man auch für den Exponenten, damit wäre nichts gewonnen.
Steht aber auch für XOR. Das wäre ja dann die nächste Doppelbelegung.

von Nano (Gast)


Lesenswert?

(prx) A. K. schrieb:
> Rolf M. schrieb:
>> Am liebsten wäre mir, wenn es mit dem const umgekehrt wäre, also wenn es
>> das Schlüsselwort const gar nicht gäbe, weil alles per Default konstant
>> ist und man stattdessen mit einem Schlüsselwort wie z.B. mutable oder
>> variable die Konstantheit explizit ausschalten müsste.
>
> Das liess sich aber aufgrund der heiligen Kuh in C89 nicht mehr machen.

Es wäre aber möglich es mit einer Compilerwarnung wie bei dem Switch 
Fallhrough umzusetzen.

Hat eine Variable kein const davor gesetzt, dann gibt es eine Warnung, 
es sei denn, eine veränderliche Variable ist explizit gewünscht.
Und das könnte man dann mit einem Kommentar davor anzeigen.
Z.B.
/* mutable */ int c = 42;
oder kürzer:
/* mut */ int c = 42;

Der Compiler könnte dann nachgucken, ob so ein Kommentar davor steht und 
wenn das nicht der Fall ist, und mit sagen wir mal -Wconst compilert 
werden soll, dann wirft er eine Warnung und zeigt auf die Zeile.

Damit könnte man explizites mutable machen verlangen und so ein 
implizites const haben ohne die Sprache umdefinieren zu müssen.

Keine Ahnung ob es so etwas auch schon gibt, gefunden habe ich 
diesbezüglich nichts, zumindest nicht bei GCC:
https://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html

Es wäre natürlich viel Aufwand und den ein oder anderen wird es sogar 
stören, aber es wäre machbar.

Noch einfacher wäre es aber, wenn man einfach ab C2x für veränderliche 
Variablen folgendes verlangen würde:
mut int c = 42;
ansonsten gibt es eine Warnung, der Code compiliert aber dennoch.

Dann müsste man in Zukunft immer nur entweder mut oder const setzten:
mut int c = 42; // explizit veränderlich
const int c = 42; // explizit unveränderlich/konstant
int c = 42; // implizit veränderlich, compilert, aber mit geworfener 
Compilerwarnung

von Wilhelm M. (wimalopaan)


Lesenswert?

Stefan ⛄ F. schrieb:
> Nano schrieb:
>> Ein anderes Übel von C ist implizites Fall-Through Verhalten bei Switch
>> Anweisungen.
>
> Da muss man einfach so denken, wie die C Erfinder. Die case sind nicht
> eine Liste von alternativen Bedingungen sondern switch springt zu einer
> bestimmten Stelle innerhalb einer Liste von Befehlen. Unterhalb von
> Switch kommt nur ein einziger Code Block. Case definieren keine Blöcke,
> sondern Sprungziele.
>
> In Go haben sie das geändert, da fallen die case nicht implizit durch.

Mit -Wextra bzw. -Wimplicit-fallthrough wird das gewarnt.
Ist tatsächlich ein fallthrough gemeint, kann man den case mit 
fallthrough attributieren.

von Wilhelm M. (wimalopaan)


Lesenswert?

Zeno schrieb:
> Nano schrieb:
>> Schonmal Feldlinien in Physik gezeichnet?
> Ja sicher und in Theorethischer Elektrotechnik und in Feldtheorie auch,
> da kam aber kein Asterisk vor. Das war entweder x oder . evtl noch mit
> einem Kringel drum herum.
>
> Nano schrieb:
>> '^' braucht man auch für den Exponenten, damit wäre nichts gewonnen.
> Steht aber auch für XOR. Das wäre ja dann die nächste Doppelbelegung.

Du kannst gerne für die Operatoren auch die "alternative tokens" wie 
xor, or, ... einsetzen.

: Bearbeitet durch User
von MaWin O. (mawin_original)


Lesenswert?

Nano schrieb:
> Der Compiler könnte dann nachgucken, ob so ein Kommentar davor steht

Nein. Bitte nicht. Kommentare mit semantischer Bedeutung sind schlimm.
Jede Sprache, die das gemacht hat, hat es verkackt. Das kann man gar 
nicht sinnvoll umsetzen und verwenden.

Kommentare sind Kommentare. Keine Syntax.

von Zeno (Gast)


Lesenswert?

Wilhelm M. schrieb:
> Du kannst gerne für die Operatoren auch die "alternative tokens" wie
> xor, or, ... einsetzen.
Mag ja alles sein, aber es wurde explizit darauf hingewiesen das ^ für 
XOR bzw. Potenz steht und das ist schlichtweg ne Doppelbedeutung. Ob man 
dafür auch xor, or, and etc. schreiben kan stand nicht zur Debatte - es 
ändert ja auch nichts an der Doppelbedeutung.

von Wilhelm M. (wimalopaan)


Lesenswert?

MaWin O. schrieb:
> Nano schrieb:
>> Der Compiler könnte dann nachgucken, ob so ein Kommentar davor steht
>
> Nein. Bitte nicht. Kommentare mit semantischer Bedeutung sind schlimm.
> Jede Sprache, die das gemacht hat, hat es verkackt. Das kann man gar
> nicht sinnvoll umsetzen und verwenden.
>
> Kommentare sind Kommentare. Keine Syntax.

Kein Syntax? Nun, dann würden Sie von der Sprache nicht erkannt. Diese 
Aussage ist also Quatsch.
Kommentare werden in Phase 3 eliminiert, also vor dem Präprozessor.

Aber Du hast recht: wenn Kommentare eine Semantik bekommen, sind sie 
i.a. keine wirklichen Kommentare mehr. Java kennt dafür Annotationen: 
auch so ein Krücke.

Kommentare werden i.a. überbewertet. Das Grundübel dabei ist, das 
Kommentare anders altern als der umgebende Code!
Daher die Regel: Kommentier nur das, was der Code nicht sagen kann, und 
nicht das, was der Code nicht sagt. Wie man leicht sieht, erwächst 
daraus die Pflicht, den Code so zu gestalten, dass er keine Kommentare 
braucht.

von MaWin O. (mawin_original)


Lesenswert?

Wilhelm M. schrieb:
> Kein Syntax? Nun, dann würden Sie von der Sprache nicht erkannt.

Also für Autisten noch einmal: Der Inhalt von Kommentaren ist keine 
Syntax.

> Das Grundübel dabei ist, das
> Kommentare anders altern als der umgebende Code!

Nur, wenn man sich nicht im Griff hat.

> erwächst
> daraus die Pflicht, den Code so zu gestalten, dass er keine Kommentare
> braucht.

Das geht aber gar nicht.
Man kann in einer Programmiersprache ohne Kommentare gar nicht alle 
Dinge ausdrücken, die man sinnvollerweise dokumentieren sollte.

von Wilhelm M. (wimalopaan)


Lesenswert?

MaWin O. schrieb:
> Wilhelm M. schrieb:
>> Kein Syntax? Nun, dann würden Sie von der Sprache nicht erkannt.
>
> Also für Autisten noch einmal: Der Inhalt von Kommentaren ist keine
> Syntax.

Danke für Deine psychologische Analyse ;-)

Oben hast Du es anders geschrieben, jetzt sagst Du "der Inhalt".
Jetzt für Dich nochmal: Ein Kommentar hat bei C ein paar mögliche 
Ausprägungen, die durch die Syntax der Sprache beschrieben sind.

>
>> Das Grundübel dabei ist, das
>> Kommentare anders altern als der umgebende Code!
>
> Nur, wenn man sich nicht im Griff hat.

Welcher Programmierer hat sich denn im Griff im echten Leben. Schau Dir 
mal echten Code an!

>> erwächst
>> daraus die Pflicht, den Code so zu gestalten, dass er keine Kommentare
>> braucht.
>
> Das geht aber gar nicht.
(Du hast den Satz aus dem Zusammenhang gerissen, der vorangehende Satz 
fehlt)
Natürlich geht das.
Wenn man sich genügend Mühe gibt, geht das sogar mit C. Ok, mit C++ ist 
es leichter. Aber das verlangt eben vom Programmierer viel mehr 
Nachdenken und Designabwägungen, als einfach mal einen Kommentar dahin 
zu schmieren. Letztendlich führt das meistens zu besserem Code.

> Man kann in einer Programmiersprache ohne Kommentare gar nicht alle
> Dinge ausdrücken, die man sinnvollerweise dokumentieren sollte.

Ich habe auch nicht gesagt, dass man nichts(!) kommentieren sollte. Lies 
Dir meinen Satz dazu nochmal ganz in Ruhe durch und denke nach.

: Bearbeitet durch User
von MaWin O. (mawin_original)


Lesenswert?

Wilhelm M. schrieb:
> Natürlich geht das.

Wie beschreibt man denn in C, warum man eine Berechnung macht?
Ich kann das nur in einem Kommentar.

Wilhelm M. schrieb:
> Ich habe auch nicht gesagt, dass man nichts(!) kommentieren sollte. Lies
> Dir meinen Satz dazu nochmal ganz in Ruhe durch und denke nach.

Ich finde den Satz ziemlich eindeutig:

Wilhelm M. schrieb:
> Wie man leicht sieht, erwächst
> daraus die Pflicht, den Code so zu gestalten, dass er keine Kommentare
> braucht.

von (prx) A. K. (prx)


Lesenswert?

MaWin O. schrieb:
> Also für Autisten noch einmal: Der Inhalt von Kommentaren ist keine
> Syntax.

In realem Pascal gab es schon früh sprachrelevante Kommentare mit 
eigener Syntax.

: Bearbeitet durch User
von Wilhelm M. (wimalopaan)


Lesenswert?

MaWin O. schrieb:
> Ich finde den Satz ziemlich eindeutig:
>
> Wilhelm M. schrieb:
>> Wie man leicht sieht, erwächst
>> daraus die Pflicht, den Code so zu gestalten, dass er keine Kommentare
>> braucht.

Schon wieder falsch zitiert.
Das folgende war die Regel:

Daher die Regel: Kommentier nur das, was der Code nicht sagen kann, und
nicht das, was der Code nicht sagt.

von Stefan F. (Gast)


Lesenswert?

MaWin O. schrieb:
> Wie beschreibt man denn in C, warum man eine Berechnung macht?
> Ich kann das nur in einem Kommentar.

Ja +1 dafür.

von MaWin O. (mawin_original)


Lesenswert?

Wilhelm M. schrieb:
> Schon wieder falsch zitiert.
> Das folgende war die Regel:

Du reitest darauf herum, dass ich mit "ein Kommentar" eigentlich "den 
Kommentarinhalt" meinte. Was IMO offensichtlich war.

Wilhelm M. schrieb:
> Daher die Regel: Kommentier nur das, was der Code nicht sagen kann, und
> nicht das, was der Code nicht sagt. Wie man leicht sieht, erwächst
> daraus die Pflicht, den Code so zu gestalten, dass er keine Kommentare
> braucht.

Der zweite Satz schränkt den ersten ein.
Und dann bleibt über:

> Wie man leicht sieht, erwächst
> daraus die Pflicht, den Code so zu gestalten, dass er keine Kommentare
> braucht.

von Wilhelm M. (wimalopaan)


Lesenswert?

MaWin O. schrieb:
> Wilhelm M. schrieb:
>> Schon wieder falsch zitiert.
>> Das folgende war die Regel:
>
> Du reitest darauf herum, dass ich mit "ein Kommentar" eigentlich "den
> Kommentarinhalt" meinte. Was IMO offensichtlich war.

Ach so, Du meintest eigentlich ... nun, dann bin ich bei Deinen Aussagen 
in Zukunft etwas "kreativer" ;-)

>
> Wilhelm M. schrieb:
>> Daher die Regel: Kommentier nur das, was der Code nicht sagen kann, und
>> nicht das, was der Code nicht sagt. Wie man leicht sieht, erwächst
>> daraus die Pflicht, den Code so zu gestalten, dass er keine Kommentare
>> braucht.
>
> Der zweite Satz schränkt den ersten ein.
> Und dann bleibt über:
>
>> Wie man leicht sieht, erwächst
>> daraus die Pflicht, den Code so zu gestalten, dass er keine Kommentare
>> braucht.

Nun, wenn Du oben "eigentlich nur" den Kommentarinhalt meintest, dann 
solltest Du eigentlich auch erfassen können was durch das folgende 
gemeint war (immer noch falsch zitiert):

Kommentare werden i.a. überbewertet. Das Grundübel dabei ist, das
Kommentare anders altern als der umgebende Code!
Daher die Regel: Kommentier nur das, was der Code nicht sagen kann, und
nicht das, was der Code nicht sagt. Wie man leicht sieht, erwächst
daraus die Pflicht, den Code so zu gestalten, dass er keine Kommentare
braucht.

von MaWin O. (mawin_original)


Lesenswert?

Wilhelm M. schrieb:
> Nun, wenn Du oben "eigentlich nur" den Kommentarinhalt meintest, dann
> solltest Du eigentlich auch erfassen können was durch das folgende
> gemeint war (immer noch falsch zitiert):
>
> Kommentare werden i.a. überbewertet. Das Grundübel dabei ist, das
> Kommentare anders altern als der umgebende Code!
> Daher die Regel: Kommentier nur das, was der Code nicht sagen kann, und
> nicht das, was der Code nicht sagt. Wie man leicht sieht, erwächst
> daraus die Pflicht, den Code so zu gestalten, dass er keine Kommentare
> braucht.

Ok. Also eine Pflicht zu kommentarfreiem Code. Das steht da 
wortwörtlich. Und der Kontext ändert daran genau gar nichts.
Auch in dieser Zitatfassung.
Was willst du uns eigentlich sagen? Dass der Fehler bei uns liegt, wenn 
du dich vertippst?

von Wilhelm M. (wimalopaan)


Lesenswert?

MaWin O. schrieb:
> Wilhelm M. schrieb:
>> Nun, wenn Du oben "eigentlich nur" den Kommentarinhalt meintest, dann
>> solltest Du eigentlich auch erfassen können was durch das folgende
>> gemeint war (immer noch falsch zitiert):
>>
>> Kommentare werden i.a. überbewertet. Das Grundübel dabei ist, das
>> Kommentare anders altern als der umgebende Code!
>> Daher die Regel: Kommentier nur das, was der Code nicht sagen kann, und
>> nicht das, was der Code nicht sagt. Wie man leicht sieht, erwächst
>> daraus die Pflicht, den Code so zu gestalten, dass er keine Kommentare
>> braucht.
> Was willst du uns eigentlich sagen? Dass der Fehler bei uns liegt, wenn
> du dich vertippst?

Ich erwarte von Dir das gleiche wie Du vorher von mir. So wie Du oben 
eigentlich nur den Inhalt des Kommentars und nicht das syntaktische 
Konstrukt Kommentar meintest, so darfst Du auch hier gerne ein 
"möglichst" ergänzen. Nun verstanden?

von MaWin O. (mawin_original)


Lesenswert?

Wilhelm M. schrieb:
> So wie Du oben
> eigentlich nur den Inhalt des Kommentars und nicht das syntaktische
> Konstrukt Kommentar meintest, so darfst Du auch hier gerne ein
> "möglichst" ergänzen. Nun verstanden?

Ja. Kein Problem. Dann interpretiere ich das nun so.

Hättest du natürlich auch gleich so schreiben können, statt mir den 
Fehler beim Leseverständnis zuzuschreiben.

von Nano (Gast)


Lesenswert?

MaWin O. schrieb:
> Nano schrieb:
>> Der Compiler könnte dann nachgucken, ob so ein Kommentar davor steht
>
> Nein. Bitte nicht. Kommentare mit semantischer Bedeutung sind schlimm.
> Jede Sprache, die das gemacht hat, hat es verkackt. Das kann man gar
> nicht sinnvoll umsetzen und verwenden.
>
> Kommentare sind Kommentare. Keine Syntax.

Wie schon gesagt, bei dem Fallthrough Problem wird genau das gemacht:
Siehe nochmal:
https://lwn.net/Articles/794944/

Und das ist vor allem abwärtskompatibel und würde so noch mit C89 
funktionieren. Es müsste nur der Compiler angepasst werden.
Und wenn du es nicht nutzen willst, dann nutzt du einfach die 
Compileroption nicht, so wie bei dem Fallthrough Problem auch.

Und, wie ich bereits sagte, für spätere Versionen, z.b. C2x
definiert man es dann zu
mut int x = 42;

Dann ist es Sprachstandard und würde dann ab C2x funktionieren.

von Nano (Gast)


Lesenswert?

Wilhelm M. schrieb:
> Daher die Regel: Kommentier nur das, was der Code nicht sagen kann, und
> nicht das, was der Code nicht sagt. Wie man leicht sieht, erwächst
> daraus die Pflicht, den Code so zu gestalten, dass er keine Kommentare
> braucht.

Code der gar keine Kommentare enthält ist Müll.
Du brauchst mindestens Dokumentationskommentare was der Code macht.
Bei Funktionen gehören dazu bspw. auch eine Erläuterung der 
Funktionsparameter, sowie Vor- und Nachbedingungen dazu.

von MaWin O. (mawin_original)


Lesenswert?

Nano schrieb:
> Wie schon gesagt, bei dem Fallthrough Problem wird genau das gemacht:

Nein. Das war nur eine (schlechte) Idee.
Vielleicht wurde es auch irgendwo implementiert. Keine Ahnung. Es ist 
und bleibt eine Nicht-Standard schlechte Idee.

Die wirkliche Syntax sieht so aus:
https://en.cppreference.com/w/c/language/attributes/fallthrough

von Nano (Gast)


Lesenswert?

MaWin O. schrieb:
> Nano schrieb:
>> Wie schon gesagt, bei dem Fallthrough Problem wird genau das gemacht:
>
> Nein. Das war nur eine (schlechte) Idee.
> Vielleicht wurde es auch irgendwo implementiert. Keine Ahnung. Es ist
> und bleibt eine Nicht-Standard schlechte Idee.

Nein, die Idee ist gut, weil du das nicht nutzen musst, aber der, der es 
nutzen möchte, z.b. bei Falllthrough die Linux Kernel Entwickler, die 
können es dann nutzen.

Der Code compiliert so auch immer.



> Die wirkliche Syntax sieht so aus:
> https://en.cppreference.com/w/c/language/attributes/fallthrough

Und das ist die Erweiterung erst ab C2x.

Bei dem mutable Problem könntest du also hier bei C2x, wie ich oben 
schrieb ein:
mut int ...
haben.


Es geht also erst einmal darum, diese Möglichkeit überhaupt zu bieten.
Da so etwas noch nicht im Sprachstandard ist, geht das jetzt also nur so 
wie bei dem fallthrough Teil auch nur über Kommentare oder 
Compilerspezifische Attribute.
Letzteres macht deinen Code aber Compilerabhängig und auch 
Compilerversionsabhängig, was auch das Problem bei dem fallthrough 
Problem war und weswegen die Kernelentwickler das als Kommentare immer 
noch bevorzugen.
Und später, kann man es dann als Sprachstandard nutzen.

Für dich ändert sich somit nichts, wenn du dieses Feature nicht nutzen 
möchtest, aber andere könnten davon so schon viel früher profitieren.

von MaWin O. (mawin_original)


Lesenswert?

Nano schrieb:
> Nein, die Idee ist gut, weil du das nicht nutzen musst

Die Idee ist sehr schlecht, weil Kommentare plötzlich syntaktisch oder 
semantisch relevant werden.

Wenn ich irgendwie /* fallthrough */ geschrieben habe, weil in meinem 
Spiel halt dort der Charakter irgendwo durchfallen soll, dann hat das 
plötzlich eine Bedeutung für den Compiler.

Das ist eine absolut dumme Idee.

von Nano (Gast)


Lesenswert?

MaWin O. schrieb:
> Nano schrieb:
>> Nein, die Idee ist gut, weil du das nicht nutzen musst
>
> Die Idee ist sehr schlecht, weil Kommentare plötzlich syntaktisch oder
> semantisch relevant werden.

Nur wenn du es nutzen willst, ansonsten nicht.
Und wenn du es nutzen willst, dann weißt du ja darum.


> Wenn ich irgendwie /* fallthrough */ geschrieben habe, weil in meinem
> Spiel halt dort der Charakter irgendwo durchfallen soll, dann hat das
> plötzlich eine Bedeutung für den Compiler.

Ja, der Compiler guckt dann aber auch nach, ob das sich wirklich vor 
einem
case Bezeichner innerhalb eines Switchblocks befindet.
Und das ist doch ein sehr unüblicher Ort für Kommentare.
Oder schreibst du ein Kommentar immer vor den Befehl innerhalb der 
gleichen Zeile?

> Das ist eine absolut dumme Idee.

Nein, s.o.

von MaWin (Gast)


Lesenswert?

Nano schrieb:
> Nur wenn du es nutzen willst, ansonsten nicht.

Oder, wenn es halt per Zufall dort steht.
Funktionalität in Kommentare zu bringen, ist eine sehr sehr sehr 
schlechte Idee.

Wo hört man auf?

Nano schrieb:
> Ja, der Compiler guckt dann aber auch nach, ob das sich wirklich vor
> einem
> case Bezeichner innerhalb eines Switchblocks befindet.

Ja dann bin ich aber froh, dass er doch noch orakelt, um zu erkennen, 
dass er möglicherweise falsch liegt.

Wenn bei anderen APIs gilt, dass man sie wegen Rückwärtskompatibilität 
nicht syntaktisch und semantisch ändern darf, dann muss das auch für 
Kommentare gelten.

Und da Kommentare keine syntaktische und semantische Relevanz haben, ist 
die einzige Möglichkeit das beizubehalten.

von Nano (Gast)


Lesenswert?

MaWin schrieb:
> Nano schrieb:
>> Nur wenn du es nutzen willst, ansonsten nicht.
>
> Oder, wenn es halt per Zufall dort steht.

Nochmal, schreibst du ein Kommentar immer vor den Befehl innerhalb der
gleichen Zeile?

Also anstatt:
int c = 42; // Die Antwort auf alle Fragen

das hier:
/* Die Antwort auf alle Fragen */ int c = 42;

ernsthaft?

> Funktionalität in Kommentare zu bringen, ist eine sehr sehr sehr
> schlechte Idee.

Im Linux Kernel hat das nachweislich viele Bugs beseitigt. Siehe der 
Link.
Also kann das keine schlechte Idee sein.

> Wenn bei anderen APIs gilt, dass man sie wegen Rückwärtskompatibilität
> nicht syntaktisch und semantisch ändern darf, dann muss das auch für
> Kommentare gelten.

Wenn du dich um Rückwärtskompatibilität kümmern musst, dann nutzt du 
diese Compileroption einfach nicht, falls das ein Problem sein sollte, 
was zu bezweifeln ist.

von MaWin (Gast)


Lesenswert?

Nano schrieb:
> ernsthaft?

Es geht mir ums Prinzip.
Kommentare wurden mir vom Standard syntax- und semantikfrei versprochen.
Also muss das auch so bleiben.

> Im Linux Kernel hat das nachweislich viele Bugs beseitigt.

Ja. Ist mir bekannt.
Aber das heißt nicht, dass man diese Sonderimplementierung in einen 
Spachstandard übernehmen soll.
Das kann man auch als Privat-Checker im Kernel-Projekt machen, bis es 
dann vernünftig im Sprachstandard (ohne Kommentarverstümmelung) 
implementiert wird.

von Nano (Gast)


Lesenswert?

MaWin schrieb:
> Aber das heißt nicht, dass man diese Sonderimplementierung in einen
> Spachstandard übernehmen soll.

Das wurde auch nicht behauptet. Es soll ja in den Compiler und später 
kommt ein

mut int c = 42;

für den Sprachstandard.

von MaWin (Gast)


Lesenswert?

Nano schrieb:
> Es soll ja in den Compiler und später kommt

Und in der Zwischenzeit hat man inkompatiblen und inkonsistenten Mist, 
der Kommentare interpretiert, im Compiler?
Nein, danke.

von Nano (Gast)


Lesenswert?

MaWin schrieb:
> Nano schrieb:
>> Es soll ja in den Compiler und später kommt
>
> Und in der Zwischenzeit hat man inkompatiblen und inkonsistenten Mist,
> der Kommentare interpretiert, im Compiler?
> Nein, danke.

Da es im Kommentar ist, stört es beim Compilieren nicht und kann den 
Code trotzdem compilieren. Darfst dann halt nicht diese Option nutzen.
Als Anwender sollte das aber auch für dich kein Problem sein und der 
Progger wird schon den passenden Compiler verwenden.
Und es steht ja nichts dagegen, dass sich die Compilerhersteller 
einigen.

von Roland F. (rhf)


Lesenswert?

Hallo,
Nano schrieb:
> Es soll ja in den Compiler und später kommt ein
>
> mut int c = 42;
>
> für den Sprachstandard.

Ich verstehe nicht warum es so wichtig sein soll eine 52 Jahre alte 
Programmiersprache um solche Eigenschaften zu erweitern.
Lasst doch C einfach so wie es ist und wendet euch bei Bedarf anderen 
Programmiersprachen zu, die das und die vielen anderen Eigenarten und 
Merkwürdigkeiten von C nicht haben.

rhf

von Nano (Gast)


Lesenswert?

Roland F. schrieb:
> Hallo,
> Nano schrieb:
>> Es soll ja in den Compiler und später kommt ein
>>
>> mut int c = 42;
>>
>> für den Sprachstandard.
>
> Ich verstehe nicht warum es so wichtig sein soll eine 52 Jahre alte
> Programmiersprache um solche Eigenschaften zu erweitern.

Weil man damit bestehenden Code verbessern könnte.

Es bedeutet eine Fehlerquelle weniger und wer weiß schon wieviele 
tausende unentdeckter Bugs darauf pro größerem Softwareprojekt basieren.

von MaWin (Gast)


Lesenswert?

Nano schrieb:
> Weil man damit bestehenden Code verbessern könnte.

Verbessern, oder zerstören.
Je nachdem, was denn nun in den Kommentaren steht.

Interpretierte Kommentare sind grundsätzlich abzulehnen.

Und ja, unsinnige Warnungen sind auch Zerstörungen.

von Oliver S. (oliverso)


Lesenswert?

Nano schrieb:
> Damit könnte man explizites mutable machen verlangen und so ein
> implizites const haben ohne die Sprache umdefinieren zu müssen.
>
> Keine Ahnung ob es so etwas auch schon gibt, gefunden habe ich
> diesbezüglich nichts, zumindest nicht bei GCC

Ist in Arbeit. Wenn es fertig ist, reicht es aus, die Dateiendung von .c 
in .rs zu ändern, und schon hast du deine expliziten mutables - und ganz 
viele andere goodies dazu.

Ansonsten sind Compilerswitches, die sehr grundlegende Definitionen 
einer Sprache beeinflussen, nicht das, was weiterhilft.

Oliver

von Stefan F. (Gast)


Lesenswert?

Ich finde es auch sehr blöd, wenn funktionale Anweisungen in Kommentaren 
verborgen werden. Damit rechnet man nicht, vor allem nicht, wenn man 
dieses oder jenes "neue" Feature dieser Art noch nicht kennt.

von Wilhelm M. (wimalopaan)


Lesenswert?

Nano schrieb:
> Wilhelm M. schrieb:
>> Daher die Regel: Kommentier nur das, was der Code nicht sagen kann, und
>> nicht das, was der Code nicht sagt. Wie man leicht sieht, erwächst
>> daraus die Pflicht, den Code so zu gestalten, dass er keine Kommentare
>> braucht.
>
> Code der gar keine Kommentare enthält ist Müll.
> Du brauchst mindestens Dokumentationskommentare was der Code macht.
> Bei Funktionen gehören dazu bspw. auch eine Erläuterung der
> Funktionsparameter, sowie Vor- und Nachbedingungen dazu.

Leider hast Du den Verlauf der Diskussion hier nicht ganz korrekt 
verfolgt. Die Plakativität des Nachsatzes habe ich durch ein "möglichst" 
entschärft (MaWin hatte Schwierigkeiten die Regel (erster Satz) von der 
zu plakativen Folgerung (zweiter Satz) zu unterscheiden).

Deswegen hier nochmal in leicht geänderter Form (die ursprünglich 
intendiert war):

Kommentare werden i.a. überbewertet. Das Grundübel dabei ist, das
Kommentare anders altern als der umgebende Code!
Daher die Regel: Kommentier nur das, was der Code nicht sagen kann, und
nicht das, was der Code nicht sagt. Wie man leicht sieht, erwächst
daraus die Pflicht, den Code möglichst so zu gestalten, dass er keine 
Kommentare
braucht.

Bei einer Schnittstelle wie
1
namespace ProtocollA{
2
 class Connection {
3
     void shutdown(); 
4
     template<size_t N>
5
     bool sendTo(const Address&, const std::array<std::byte, N>&) const;
6
 };
7
}

brauche ich keine Kommentare. Ggf. kann in der Realisierung auf noch 
eine Vorbedingung wie static_assert(N < 256) eingebaut werden.

Bei
1
void shutdown(int connection); 
2
bool sendTo(int connection, int device, int endpoint, const char* data, int length);

sind dagegen natürlich Kommentare erforderlich, weil die Schnittstelle 
schlecht ist: bei shutdown() ist connection anscheinend eine abstrakte 
Referenz auf irgendein internes Objekt. Was passiert, wenn dieses Objekt 
nicht existiert? Was ist der gültige Wertebereich?
Bei sendto() ebenso und auch bzgl. der Parameter device und endpoint. 
Der Parameter data ist ein Zeiger, gehört nullptr zum Wertebereich? char 
ist ein unspezifischer Datentyp: sind dies nun Ganzzahlen, Zeichen oder 
einfach nur Bytes? Gehört length semantisch zu data? Gibt es eine 
Obergrenze für die Anzahl length. Warum int als DT (Längen / Anzahlen 
sind nicht-negativ).
Dies sind nur einige Anmerkungen.

Ja, dieses Beispiel ist konstruiert, trotzdem findet man es so ähnlich 
allenthalben.

Was ich damit sagen will ist:
gestalte eine Schnittstelle so, dass sie leicht richtig und nur schwer 
falsch zu benutzen ist.

Und je mehr Kommentare man lesen muss, desto größer ist die Chance, die 
Schnittstelle falsch zu benutzen.

von Wilhelm M. (wimalopaan)


Lesenswert?

Nano schrieb:
> Roland F. schrieb:
>> Hallo,
>> Nano schrieb:
>>> Es soll ja in den Compiler und später kommt ein
>>>
>>> mut int c = 42;
>>>
>>> für den Sprachstandard.
>>
>> Ich verstehe nicht warum es so wichtig sein soll eine 52 Jahre alte
>> Programmiersprache um solche Eigenschaften zu erweitern.
>
> Weil man damit bestehenden Code verbessern könnte.
>
> Es bedeutet eine Fehlerquelle weniger und wer weiß schon wieviele
> tausende unentdeckter Bugs darauf pro größerem Softwareprojekt basieren.

Dann sollten wir die Diskussion mal erweitern auf ein weiteres Problem 
mit den primitiven DT wie int, ...: der Wertebereich ist durch die 
Implementierung vorgegeben und passt eben meistens nicht zur 
Problemstellung. Besser wären Datentypen wie etwa
1
int<0, 99> p;
um auszudrücken, welchen Wertebereich p nun tatsächlich umfasst. Das 
würde auch viel Ungemach verhindern. Kann man sich natürlich bei C++ 
definieren (oder eine Bibliothek verwenden) als uint_ranged<0, 99> oder 
uint_circular<0,99>, aber direkt in die fundamentalen DT eingebaut wäre 
natürlich besser.

von Stefan F. (Gast)


Lesenswert?

> int<0, 99> p;

Bei REST Interface geben wir tatsächlich den Wertebereich an, sofern er 
für irgend etwas wichtig ist. Ich frage mich nur, was die 
Programmiersprache mit so einer Angabe anfangen soll. Sie kann ja 
schlecht bei jeder Zuweisung/Operation die Gültigkeit prüfen und ggf. 
eine Exception auslösen. Erstens gibt es in C keine Exceptions und 
zweitens würde das die Performance versauen.

Das ist allerdings eine gute Stelle für Kommentare.

> int p; // must be 0-99, requested in ticket 1234

von Wilhelm M. (wimalopaan)


Lesenswert?

Stefan ⛄ F. schrieb:
>> int<0, 99> p;
>
> Bei REST Interface geben wir tatsächlich den Wertebereich an, sofern er
> für irgend etwas wichtig ist. Ich frage mich nur, was die
> Programmiersprache mit so einer Angabe anfangen soll. Sie kann ja
> schlecht bei jeder Zuweisung/Operation die Gültigkeit prüfen und ggf.
> eine Exception auslösen. Erstens gibt es in C keine Exceptions und
> zweitens würde das die Performance versauen.

Natürlich eine Assertions-Verletzung feuern.

> Das ist allerdings eine gute Stelle für Kommentare.
>
>> int p; // must be 0-99, requested in ticket 1234

Nein, dann sollte man es so schreiben:
1
const int p = calculate();
2
assert((p >= 0) && (p <= 99));

Assertionen sind auswertbare Kommentare!

von Stefan F. (Gast)


Lesenswert?

Wilhelm M. schrieb:
> Natürlich eine Assertions-Verletzung feuern.

Ich bin da nicht sattelfest, korrigiere mich bitte wenn ich falsch 
liege.

Aber eine Assertion führt nach meinem Kenntnisstand immer zu einem 
Programmabbruch. Das will man oft nicht, weil dann die Maschine bzw. der 
Dienst sofort ausfällt.


Daher heisst es (auf 
https://ptolemy.berkeley.edu/~johnr/tutorials/assertions.html) völlig 
korrekt:
> Assertions are not a mechanism for handling run-time errors

von Leon (Gast)


Lesenswert?

Stefan ⛄ F. schrieb:
> Stattdessen wird nun auch C11 gesetzt.

Braucht man Linux überhaupt? Das ist doch dies mit der Kommanzozeile und 
Basic? Nimm doch Windows, da kannst du bequem mit der Maus arbeiten und 
es gibt auch viele Programme und Spiele.

von Wilhelm M. (wimalopaan)


Lesenswert?

Stefan ⛄ F. schrieb:
> Wilhelm M. schrieb:
>> Natürlich eine Assertions-Verletzung feuern.
>
> Ich bin da nicht sattelfest, korrigiere mich bitte wenn ich falsch
> liege.
>
> Aber eine Assertion führt nach meinem Kenntnisstand immer zu einem
> Programmabbruch. Das will man oft nicht, weil dann die Maschine bzw. der
> Dienst sofort ausfällt.

Ja, das ist auch gut so (bei C / C++ nur, wenn NDEBUG nicht definiert 
ist).


> Daher heisst es (auf
> https://ptolemy.berkeley.edu/~johnr/tutorials/assertions.html) völlig
> korrekt:
>> Assertions are not a mechanism for handling run-time errors

Ja, eine Assertions-Verletzung darf nie dazu benutzt werden, um bspw. 
Benutzerfehler, extern getriggerte Probleme odgl. zu behandeln. 
Assertionen sind dazu da, die interne Logik des Artefaktes 
sicherzustellen. Also bspw. Vor- und Nachbedingungen zu überprüfen, 
Invarianten zu checken, etc.

Ein Schritt in die richtige Richtung beschreibt der Entwurf P0287 mit 
den "contracts" und den Attributen ensures: condition und [[expects: 
consdition]].

: Bearbeitet durch User
von Stefan F. (Gast)


Lesenswert?

Leon schrieb:
> Braucht man Linux überhaupt? Das ist doch dies mit der Kommanzozeile und
> Basic? Nimm doch Windows, da kannst du bequem mit der Maus arbeiten und
> es gibt auch viele Programme und Spiele.

Auch für Linux gibt es einen grafischen Desktop. Hauptsächlich findet 
Linux jedoch dort Anwendung, wo kein Maus-Schubser arbeitet, sondern der 
Rechner selbst. Ich wette dass du in deinem Haushalt bereits mehrere 
Geräte mit Linux hast, ohne es zu wissen. Android ist zum Beispiel ein 
Linux System.

Linux ist unter Programmierern beliebt, insbesondere denen, die 
Programme für Linux entwickeln. Das finde ich auch total logisch. Warum 
soll man sich beim Programmieren freiwillig mit zwei Betriebssystemen 
gleichzeitig auseinander setzen (dem PC und dem Target), wenn es nicht 
sein muss?

Wenn ich den ganzen Tag lang an Harleys schrauben würde, würde ich wohl 
auch eine solche fahren.

Klar könnte man statt Linux auch Windows benutzen. Microsoft hat es mit 
diversen embedded Versionen mehrfach versucht, jedoch mit mäßigem 
Erfolg. Viel wichtiger finde ich aber, dass eine gewisse Vielfalt 
vorhanden ist. Wenn es nur Windows gäbe, könnte Microsoft ganz alleine 
die Welt regieren.

von Rolf M. (rmagnus)


Lesenswert?

Wilhelm M. schrieb:
> Rolf M. schrieb:
>> Wie macht man dann sowas:
>> void setColor(uint8_t r, uint8_t g, uint8_t b, uint8_t alpha);
>>
> void setColor(Red, Green, Blue, Alpha);

Also für jede Grundfarbe ein eigener Typ? Und beim geometrischen Vektor 
auch für jede Dimension? Das halte ich für wenig sinnvoll. Wie macht man 
das bei einem n-dimensionalen mathematischen Vektor, wo n ein 
Template-Parameter ist? Irgendwelches Template-Gehampel, das dafür 
sorgt, dass jede Dimension einen eigenen Datentyp bekommt?

Wilhelm M. schrieb:
> Oliver S. schrieb:
>> Wilhelm M. schrieb:
>>> Wieder ein Punkt für die kleinen Goodies von C++.
>>
>> Du meinst sicher die wunderbaren Vorzüge der uniform Initialization wie
>> in
>>
>>std::vector<int>{3}
>>
>> Oliver
>
> Ja, steht doch so oben ... (???)

Ich vermute, er will damit sagen, dass das - anders als man vielleicht 
erwarten würde - was ganz anderes macht als
1
std::vector<int>(3)

Man hat also eine neue Initialisierungsmethode mit strengerer Typprüfung 
eingeführt, die die alte ersetzt - bis auf die Stellen, wo sie auf 
einmal eine ganz andere Bedeutung hat…

Nano schrieb:
> Wie schon gesagt, bei dem Fallthrough Problem wird genau das gemacht:
> Siehe nochmal:
> https://lwn.net/Articles/794944/
>
> Und das ist vor allem abwärtskompatibel und würde so noch mit C89
> funktionieren. Es müsste nur der Compiler angepasst werden.

Also Kompatibilität, indem man neue Syntax-Elemente einfach in die 
Kommentare verschiebt? Das halte ich für eine sehr schlechte Idee.

Nano schrieb:
> Es geht also erst einmal darum, diese Möglichkeit überhaupt zu bieten.
> Da so etwas noch nicht im Sprachstandard ist, geht das jetzt also nur so
> wie bei dem fallthrough Teil auch nur über Kommentare oder
> Compilerspezifische Attribute.

Oder Makros.
1
#if __STDC_VERSION__ < 202205L
2
#define mut
3
#endif

MaWin O. schrieb:
>> Das Grundübel dabei ist, das
>> Kommentare anders altern als der umgebende Code!
>
> Nur, wenn man sich nicht im Griff hat.

Nein, das funktioniert nie richtig. Ich hab einfach schon zu viel Code 
gesehen, bei dem der Kommentar nur verwirrt hat, weil er nicht zu dem 
gepasst hat, was der Code tatsächlich macht. Und wenn das passiert, 
richtet der Kommentar viel mehr Schaden an als er vorher an Verbesserung 
gebracht hat.

> Man kann in einer Programmiersprache ohne Kommentare gar nicht alle
> Dinge ausdrücken, die man sinnvollerweise dokumentieren sollte.

Es geht sicher nicht zu 100%, aber wenn man ein bisschen darauf achtet, 
wird der überwiegende Anteil der Kommentare überflüssig, weil er nur 
noch das offensichtliche dupliziert. Für mich ist das auch kein 
schwarz/weiß. Man kann und soll nicht alle Kommentare weglassen, sondern 
den Code so schreiben, dass ihre Anzahl minimiert werden kann, ohne die 
Verständlichkeit zu verschlechtern.
Und eben nach der Regel vorgehen, dass Kommentare eher nicht beschreiben 
sollen, was gemacht wird, sondern warum es gemacht wird bzw. warum 
gerade so. Der Code selbst beschreibt bereits, was er tut.
Das bezieht sich für mich alles speziell auf Kommentare innerhalb des 
Code. Beschreibungen von Funktionen, Typen u.s.w. a la Doxygen sind da 
für mich nochmal ein eigenes Thema.

(prx) A. K. schrieb:
> In realem Pascal gab es schon früh sprachrelevante Kommentare mit
> eigener Syntax.

Ok, also ein guter Grund, diese Sprache zu meiden.

: Bearbeitet durch User
von Roland F. (rhf)


Lesenswert?

Hallo,
Nano schrieb:
> Weil man damit bestehenden Code verbessern könnte.

Oder auch nicht.
Wer weiß ob durch die "Sprachverbesserung" nicht Seiteneffekte 
entstehen, die an anderer Stelle ganz neue Probleme.
Gut, ich bin jetzt nur ein minderbegabter Hobbyprogrammierer und weiß 
deshalb nicht wie es bei den Profis zugeht. Aber mir erscheint obiges 
Vorgehen höchst zweifelhaft zu sein.

rhf

von MaWin (Gast)


Lesenswert?

Da zeigt sich nur mal wieder, dass es ein grundlegender Fehler ist, in 
Sprachen nicht schon von Beginn an Mechanismen einzubauen, die spätere 
Sprachänderungen vernünftig ermöglichen.

von Nano (Gast)


Lesenswert?

Oliver S. schrieb:
> Nano schrieb:
>> Damit könnte man explizites mutable machen verlangen und so ein
>> implizites const haben ohne die Sprache umdefinieren zu müssen.
>>
>> Keine Ahnung ob es so etwas auch schon gibt, gefunden habe ich
>> diesbezüglich nichts, zumindest nicht bei GCC
>
> Ist in Arbeit. Wenn es fertig ist, reicht es aus, die Dateiendung von .c
> in .rs zu ändern, und schon hast du deine expliziten mutables - und ganz
> viele andere goodies dazu.
>
> Ansonsten sind Compilerswitches, die sehr grundlegende Definitionen
> einer Sprache beeinflussen, nicht das, was weiterhilft.
>
> Oliver

Die grundlegende Definition der Sprache würde dadurch nicht beeinflusst 
werden. Lies oben nochmal.

Und Rust ist kein C.

von Nano (Gast)


Lesenswert?

Stefan ⛄ F. schrieb:
> Ich finde es auch sehr blöd, wenn funktionale Anweisungen in Kommentaren
> verborgen werden. Damit rechnet man nicht, vor allem nicht, wenn man
> dieses oder jenes "neue" Feature dieser Art noch nicht kennt.

Du bist dann doch gar nicht davon betroffen.
Wenn du nicht damit rechnest, dann nutzt du die Compileroption ja nicht.

Und wenn du sie nutzt, dann weißt du auch darüber Bescheid.

von Nano (Gast)


Lesenswert?

Wilhelm M. schrieb:
> Nano schrieb:
>> Wilhelm M. schrieb:
>>> Daher die Regel: Kommentier nur das, was der Code nicht sagen kann, und
>>> nicht das, was der Code nicht sagt. Wie man leicht sieht, erwächst
>>> daraus die Pflicht, den Code so zu gestalten, dass er keine Kommentare
>>> braucht.
>>
>> Code der gar keine Kommentare enthält ist Müll.
>> Du brauchst mindestens Dokumentationskommentare was der Code macht.
>> Bei Funktionen gehören dazu bspw. auch eine Erläuterung der
>> Funktionsparameter, sowie Vor- und Nachbedingungen dazu.
>
> Leider hast Du den Verlauf der Diskussion hier nicht ganz korrekt
> verfolgt.

Doch habe ich, nur schreibe ich immer direkt nach dem ich ein Kommentar 
gelesen habe. Ich warte grundsätzlich nicht damit, bis ich unten 
ankomme.
Die Gefahr, dadurch etwas zu übersehen ist nämlich viel zu groß.

Und auch im späteren Verlauf, in dem du dich versuchst herauswinden und 
dein ursprüngliches Kommentar umzudeuten, ändert zwar vielleicht das, 
was du sagen wolltest, aber nicht das, was du gesagt hast.

> Die Plakativität des Nachsatzes habe ich durch ein "möglichst"
> entschärft (MaWin hatte Schwierigkeiten die Regel (erster Satz) von der
> zu plakativen Folgerung (zweiter Satz) zu unterscheiden).

Nein, MaWin hat das genauso richtig erkannt wie ich, du hast dich 
anfangs nicht richtig ausgedrückt.
Aber wir können die Diskussion hier abkürzen, bringt ja nichts, du hast 
ja mittlerweile deine erste Aussage umgedeutet und klarer ausformuliert, 
so dass der Sachpunkt nicht mehr besteht.

Den jetzt mit der Umdeutung sagst du ja nichts anderes als: Code ohne 
Kommentare gibt es nicht oder ist Murks.
Also genau die Aussage von mir und MaWin.


> Bei einer Schnittstelle wie
>
1
> namespace ProtocollA{
2
>  class Connection {
3
>      void shutdown();
4
>      template<size_t N>
5
>      bool sendTo(const Address&, const std::array<std::byte, N>&) const;
6
>  };
7
> }
8
>
>
> brauche ich keine Kommentare. Ggf. kann in der Realisierung auf noch
> eine Vorbedingung wie static_assert(N < 256) eingebaut werden.

Also doch nichts verstanden.
Natürlich brauchst du ein Kommentar und zwar ein 
Dokumentationskommentar. Gerade und erst recht bei Schnittstellen, denn 
wenn andere deine Schnittstelle nutzen können sollen, dann müssen sie 
wissen, worauf sie sich verlassen können.

Du musst also, wie ich bereits sagte, auch die Vor- und Nachbedingung 
definieren.

Eine Vorbedingung kann bspw. sein, dass eine als Parameter übergebener 
int Wert z.B. den Wert 1024 nicht überschreiten darf.

Das kann z.B. vorkommen, wenn deine Schnittstelle häufig aufgerufen wird 
und aus Performancegründen somit keine Prüfungen gemacht werden sollen 
ob die Werte im gewünschten Bereich liegen, aber der Code bei Werten 
über diesen Vorbedingungswert falsch rechnet.
Das ist damit gemeint.

Und das muss der wissen, der deine Schnittstelle nutzt. Es ist dann 
dessen Aufgabe, dass er darauf achtet, deine Schnittstellenfunktion nur 
mit den richtigen Daten zu füttern.

Damit er das aber weiß, ist es deine Pflicht, dies in einem 
Dokumentationskommentar zu definieren.
Das lernst du so auch heute in einem Informatikstudiengang. Ich weiß 
nicht, ob du irgendwas mit Informatik studiert hast, oder ob das schon 
30 Jahre zurückliegt, aber so wird das heute gemacht und den Grund warum 
habe ich dir oben genannt.

Lässt du das weg, dann machst du es falsch. Punkt!


> Was ich damit sagen will ist:
> gestalte eine Schnittstelle so, dass sie leicht richtig und nur schwer
> falsch zu benutzen ist.

Und wenn aus Performancegründen Wertebereichprüfungen bewusst 
weggelassen werden, dann muss der gültige Wertebereich in einem 
Dokumentationskommentar definiert sein.

von MaWin (Gast)


Lesenswert?

Nano schrieb:
>> Ich finde es auch sehr blöd, wenn funktionale Anweisungen in Kommentaren
>> verborgen werden. Damit rechnet man nicht, vor allem nicht, wenn man
>> dieses oder jenes "neue" Feature dieser Art noch nicht kennt.
>
> Du bist dann doch gar nicht davon betroffen.
> Wenn du nicht damit rechnest, dann nutzt du die Compileroption ja nicht.

Wenn du ein solches Feature hinter einem Schalter verbirgst, dann kannst 
du es auch gleich vernünftig implementieren und ein neues keyword 
einführen oder ähnliches.

von Nano (Gast)


Lesenswert?

Wilhelm M. schrieb:
> Dann sollten wir die Diskussion mal erweitern auf ein weiteres Problem
> mit den primitiven DT wie int, ...: der Wertebereich ist durch die
> Implementierung vorgegeben und passt eben meistens nicht zur
> Problemstellung. Besser wären Datentypen wie etwa
>
1
> int<0, 99> p;
2
>
> um auszudrücken, welchen Wertebereich p nun tatsächlich umfasst. Das
> würde auch viel Ungemach verhindern. Kann man sich natürlich bei C++
> definieren (oder eine Bibliothek verwenden) als uint_ranged<0, 99> oder
> uint_circular<0,99>, aber direkt in die fundamentalen DT eingebaut wäre
> natürlich besser.

So etwas könnte ich mir lediglich als zusätzliches Feature vorstellen.
Denn hier müsste der Compiler dann ja immer Prüffunktionen in den Code 
einbauen, ob die Grenzwerte auch eingehalten werden. Das kostet 
Performance und ist nicht immer gewünscht und oftmals weiß der 
Programmierer besser, an welcher Stelle so eine Prüfung sinnvoller ist, 
also z.B. außerhalb der Performance wichtigen Schleife oder er kann 
abschätzen, ob diese Werte überhaupt vorkommen können und darauf dann 
entsprechend eingehen.

D.h. ein klassisches
int p;
muss es weiterhin geben.

So eine Wertebereicheinschränkung kann es nur als Zusatz geben.

von Nano (Gast)


Lesenswert?

Stefan ⛄ F. schrieb:
> Wilhelm M. schrieb:
>> Natürlich eine Assertions-Verletzung feuern.
>
> Ich bin da nicht sattelfest, korrigiere mich bitte wenn ich falsch
> liege.
>
> Aber eine Assertion führt nach meinem Kenntnisstand immer zu einem
> Programmabbruch. Das will man oft nicht, weil dann die Maschine bzw. der
> Dienst sofort ausfällt.

Es macht auch keinen Sinn mit falschen Werten weiterzurechnen.

Ein Programmabbruch oder eine Behandlung des Fehlers, z.b. nächsten Wert 
nehmen und Fehler in die Log hauen, der dann wieder passt, ist daher 
schon sinnvoll.


> Daher heisst es (auf
> https://ptolemy.berkeley.edu/~johnr/tutorials/assertions.html) völlig
> korrekt:
>> Assertions are not a mechanism for handling run-time errors

Assertions sind auch nur dazu da, automatisiert zu überprüfen, ob der 
Code z.b. nach vielen Veränderungen immer noch das macht, was er soll, 
oder sich ein Fehler nach den Umarbeiten eingeschlichen hat.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.