Forum: Mikrocontroller und Digitale Elektronik modern C für C++ Entwickler?


von Torsten R. (Firma: Torrox.de) (torstenrobitzki)


Lesenswert?

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

von Rolf M. (rmagnus)


Lesenswert?

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.

von Torsten R. (Firma: Torrox.de) (torstenrobitzki)


Lesenswert?

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.

von Norbert M. (Gast)


Lesenswert?

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.

von Torsten R. (Firma: Torrox.de) (torstenrobitzki)


Lesenswert?

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?

von Josef (Gast)


Lesenswert?

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

von Josef (Gast)


Lesenswert?

... beschrieben ...

von Hans (Gast)


Lesenswert?

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.

von Hans (Gast)


Lesenswert?

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.

von Torsten R. (Firma: Torrox.de) (torstenrobitzki)


Lesenswert?

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 ;-)

von S. R. (svenska)


Lesenswert?

Wobei man als letzten Parameter einer struct auch einfach "char data[]" 
nehmen kann. Oder uint8_t.

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


Lesenswert?

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

von Torsten R. (Firma: Torrox.de) (torstenrobitzki)


Lesenswert?

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
Noch kein Account? Hier anmelden.