Hallo, ab und zu muss/darf ich als C++-Entwickler auch C machen. Dabei fehlt mir ein wenig der Überblick über die Errungenschaften der letzten Jahre in C. Z.B. habe ich gerade erst gelernt, dass es auch den const qualifier in C gibt. Kann jemand eine gute Übersicht, über modernes C empfehlen? Gibt es irgendwo eine Liste von Idiomen, die C typisch sind und in C++ nicht verwendet werden? TIA, Torsten
Torsten R. schrieb: > Dabei fehlt > mir ein wenig der Überblick über die Errungenschaften der letzten Jahre > in C. Z.B. habe ich gerade erst gelernt, dass es auch den const > qualifier in C gibt. Dann geht es eher um die Errungenschaften der letzten JahrZEHNte, denn const war schon vor mehr als 25 Jahren offizieller Bestandteil der Sprache C. Allerdings geht C damit etwas weniger strikt um als C++. > Kann jemand eine gute Übersicht, über modernes C empfehlen? Kommt auch drauf an, wie modern es sein darf. Versionen der C-Norm kanen 1989, 1999 und 2011 raus. > Gibt es irgendwo eine Liste von Idiomen, die C typisch sind und in C++ > nicht verwendet werden? Vieles ergibt sich einfach aus den Sprachfeatures von C++, die es in C nicht gibt, so dass man Dinge entsprechend anders lösen muss.
Rolf M. schrieb: > Vieles ergibt sich einfach aus den Sprachfeatures von C++, die es in C > nicht gibt, so dass man Dinge entsprechend anders lösen muss. Naja, dies hier z.B. wäre ja gültiges C und C++:
1 | foo* f = (foo*)malloc( sizeof( foo ) ); |
Ich bin mir aber sicher, schon mal gehört zu haben, dass man den cast in C weglässt. Genau diese "Dinger" suche ich gerade.
Torsten R. schrieb: > Hallo, ab und zu muss/darf ich als C++-Entwickler auch C machen. > Dabei fehlt mir ein wenig der Überblick über die Errungenschaften der > letzten Jahre in C. Z.B. habe ich gerade erst gelernt, dass es auch > den const qualifier in C gibt. Und seit den selben modernen Zeiten, also seit ANSI-C von 1989 hat "const" auch einen veränderlichen Brunder, nämlich "volatile". Ebenfalls mit ANSI-C eingeführt: "void" und "long double". Auch neu: Funktionsprototpen wie "int foo(char, int)" sind möglich. Dafür sind Arrays der Größe Null oder kleiner* weggefallen :-) > Kann jemand eine gute Übersicht, über modernes C empfehlen? Einen ersten Überblick über das "neue" C findet man hier: http://www.sanfoundry.com/difference-between-ansi-c-knr-c/ > Gibt es irgendwo eine Liste von Idiomen, die C typisch sind und > in C++ nicht verwendet werden? Muss ich leider passen, da meine C-Kenntnisse schon sehr schlecht sind und ich von C++ nun überhaupt keine Ahnung habe. Hier findest Du jedenfalls die Keywoards, welche davon neu sind, weiss ich nicht: http://tigcc.ticalc.org/doc/keywords.html Ansonsten sollte wohl jedes C-Buch, das in den 1990ern oder gar dieses Jahrtausend erschienen ist, kompatibel zum modernen ANSI bzw C90 sein. hth, N0R * Wozu man solche entarteten Arrays in K&R brauchen konnte weiss ich nicht, vielleicht meldet sich ein "alter C-hase" und kann's erklären.
Danke schon mal für die Tipps. Ich habe gerade noch folgendes Buch über accu.org gefunden: http://www.amazon.de/21st-Century-Tips-New-School/dp/1491903899/ref=sr_1_1?ie=UTF8&qid=1442687823&sr=8-1&keywords=21st+Century+C Kennt das jemand von euch?
ja, kenn ich. Gibt es auch auf deutsch. Das Buch ist ganz erfrischend geschrieben. Es wird wie man Sachen in modernem C99/C11 besser loesen kann. Z.B. strings, const etc. Dazu wird auch auf das ganze Drumherum wie Debugger, memory check, Versionskontrolle, externe Libraries eingegangen. Es sind gute Anregungen drin, aber auch ein paar komische. Z.B. schlaegt er vor alle Includes in einer globalen Includedatei zu sammeln. Wenn man es genau wissen will, wird man um den Standard oder eine Draft von C99/C11 nicht drumrum kommen. Cu
Norbert M. schrieb: > * Wozu man solche entarteten Arrays in K&R brauchen konnte weiss ich > nicht, vielleicht meldet sich ein "alter C-hase" und kann's erklären. Ein Array mit Größe 0 kann man in Strukturen gebrauchen, die aus einem Header mit fester Länge und Nutzdaten mit variabler Länge bestehen. Beispiel:
1 | struct Command |
2 | {
|
3 | uint32_t cmd; |
4 | uint32_t len; |
5 | uint8_t data[0]; |
6 | }
|
7 | |
8 | void send_command(const struct Command* cmd, uint32_t cmd_len); |
9 | |
10 | void write_data(const uint8_t* data, uint32_t data_len) |
11 | {
|
12 | uint32_t cmd_len = sizeof(struct Command) + data_len; |
13 | struct Command* cmd = malloc(cmd_len); |
14 | |
15 | cmd->cmd = WRITE_DATA; |
16 | cmd->len = data_len; |
17 | memcpy(cmd->data, data, data_len); |
18 | |
19 | send_command(cmd, cmd_len); |
20 | free(cmd); |
21 | }
|
Wenn man die Struktur anders definiert, z.B. mit data[1] statt data[0], muss man die Größe des Arrays bei der Berechnung von cmd_len wieder abziehen. Das macht den Code schwerer verständlich und fehleranfälliger.
Ergänzung zum Beispiel: Die Übergabe von cmd_len an send_command ist überflüssig, da sie ja schon in der Struktur steht. Im len-Feld der Struktur kann man entweder die Gesamtlänge des Kommandos oder nur die Länge der Nutzdaten angeben. Der Empfänger kann sich die jeweils andere Größe ebenso einfach mit Hilfe von sizeof(struct Command) berechnen, ohne die Länge des Dummy-Datenfelds addieren/subtrahieren zu müssen.
Hans schrieb: > Ergänzung zum Beispiel: Die Übergabe von cmd_len an send_command ist > überflüssig, da sie ja schon in der Struktur steht. Jaja, aber es ging mehr um die Fälle, in denen die Länge des Arrays kleiner als 0 ist ;-)
Wobei man als letzten Parameter einer struct auch einfach "char data[]" nehmen kann. Oder uint8_t.
:
Bearbeitet durch User
Wikipedia hat eine super auflistung aller änderungen von c: https://de.wikipedia.org/wiki/Varianten_der_Programmiersprache_C#C99 https://en.wikipedia.org/wiki/C11_(C_standard_revision) Dinge die es nur in C gibt: * compbound literal: (int[]){1,2,3} * variable length array: void x(int y){int x[y];z(x,y);} Dinge die in c fehlen: * classen * methoden (in structs) * vererbung * templates * lambdas * namespaces * der :: operator * referenzen Anderes: * malloc statt new, free stat delete, realloc existiert
Daniel A. schrieb: > Wikipedia hat eine super auflistung aller änderungen von c: > https://de.wikipedia.org/wiki/Varianten_der_Programmiersprache_C#C99 > https://en.wikipedia.org/wiki/C11_(C_standard_revision) Danke schön. Ich werde mir wohl einfach mal das Buch bestellen und unters Kopfkissen legen ;-)
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.