Was sind die nützlichsten neuen Funktionen in C99? [closed]
Lesezeit: 5 Minuten
C99 gibt es seit über 10 Jahren, aber die Unterstützung dafür kam nur langsam, so dass die meisten Entwickler bei C89 geblieben sind. Noch heute bin ich manchmal leicht überrascht, wenn ich auf C99-Features in C-Code stoße.
Jetzt, da die meisten großen Compiler C99 unterstützen (MSVC ist eine bemerkenswerte Ausnahme, und einige eingebettete Compiler hinken ebenfalls hinterher), denke ich, dass Entwickler, die mit C arbeiten, wahrscheinlich wissen sollten, welche C99-Funktionen ihnen zur Verfügung stehen. Einige der Funktionen sind nur gemeinsame Funktionen, die noch nie zuvor standardisiert wurden (snprintfzum Beispiel) oder sind aus C++ bekannt (flexible Platzierung der Variablendeklaration oder einzeilig // Kommentare), aber einige der neuen Features wurden erstmals in C99 eingeführt und sind vielen Programmierern nicht vertraut.
Was finden Sie die nützlichsten neuen Funktionen in C99?
Bitte eine Funktion pro Antwort; zögern Sie nicht, mehrere Antworten zu hinterlassen. Kurze Codebeispiele, die neue Funktionen demonstrieren, sind erwünscht.
Es sollte ein ähnliches Wiki für Features geben, die Menschen hassen im C99!
– Alok Singhal
12. Januar 2010 um 6:25 Uhr
Nun, es gab eine Frage zu schädlichen oder nicht unterstützten C99-Funktionen stackoverflow.com/questions/1898890/…
– Brian Campell
12. Januar 2010 um 6:28 Uhr
Vielen Dank. Sie sollten den Linktext ändern, um anzuzeigen, dass es sich um einen Entwurf und nicht um den tatsächlichen Standard handelt, und auf n1256 verlinken, wenn Sie schon dabei sind :-). BTW, angeschaut gcc.gnu.org/c99status.html, würde ich nicht sagen, dass der größte Teil von C99 von gcc unterstützt wird. Und da gcc einer der am weitesten verbreiteten C-Compiler ist, …
– Alok Singhal
12. Januar 2010 um 6:33 Uhr
Beachten Sie, dass C99 im Bereich der eingebetteten Prozessoren möglicherweise immer noch nicht gut unterstützt wird.
– Craig McQueen
12. Januar 2010 um 6:50 Uhr
@Alok Ich würde dieses Maß an Unterstützung als die meisten Funktionen bezeichnen. Ich nehme an, es hängt davon ab, wie Sie es definieren, aber ich denke, dass die meisten wichtigen Funktionen, die Benutzer verwenden möchten, unterstützt werden, abgesehen von einigen Bibliotheksproblemen. @Craig Fair genug, fügte einen Haftungsausschluss zu eingebetteten Compilern hinzu.
– Brian Campell
12. Januar 2010 um 7:06 Uhr
Ich bin so ans Tippen gewöhnt
for (int i = 0; i < n; ++i) { ... }
in C++, dass es mühsam ist, einen Nicht-C99-Compiler zu verwenden, wo ich gezwungen bin zu sagen
int i;
for (i = 0; i < n; ++i ) { ... }
Außerdem schränkt es den Gültigkeitsbereich der int-Variablen ein, was immer eine gute Sache ist ^^
– Helfermethode
12. Januar 2010 um 7:02 Uhr
Das wäre auch meine Wahl.
– Figura
12. Januar 2010 um 13:52 Uhr
@Oliver aber dann die Anleitung sub esp, 4 und add esp, 4 werden entfernt!
– Cole Tobin
14. November 2012 um 23:03 Uhr
stdint.hwas definiert int8_t, uint8_tusw. Sie müssen keine nicht tragbaren Annahmen mehr darüber treffen, wie breit Ihre Ganzzahlen sind.
uint32_t truth = 0xDECAFBAD;
Beste Hex-Phrase seit DE:AD:BE:EF:CA:FE.
– Kevin L.
12. Januar 2010 um 19:43 Uhr
Was soll Decafbad bedeuten?
– Schrittmacher
21. September 2013 um 4:18 Uhr
@Pacerier Es ist nur eine willkürliche Hexadezimalkonstante, die zur Veranschaulichung des Beispiels verwendet wird. Aber für den Humorwert buchstabiert es „entkoffeiniert schlecht“, was bedeutet, dass entkoffeinierter Kaffee dem echten unterlegen ist.
– Brian Campell
21. September 2013 um 17:58 Uhr
ok, mit ihrem humor kann ich nichts anfangen…
– Schrittmacher
21. September 2013 um 18:58 Uhr
Ich denke, dass die neuen Initialisierungsmechanismen extrem wichtig sind.
OK – kein überzeugendes Beispiel, aber die Notation ist korrekt. Sie können bestimmte Elemente eines Arrays und bestimmte Mitglieder einer Struktur initialisieren.
Vielleicht wäre dies ein besseres Beispiel – obwohl ich zugeben würde, dass es nicht sehr überzeugend ist:
Das ist eine überzeugende Demonstration. Es gibt eine riesige Menge an Enum-Tabellen mit entsprechenden String-Tabellen da draußen.
– u0b34a0f6ae
4. November 2011 um 9:18 Uhr
@ColeJohnson: Wenn Sie sich das zweite Beispiel genau ansehen, werden Sie feststellen, dass die Initialisierer in der falschen Reihenfolge aufgeführt sind – aber korrekt funktionieren. Das geht nicht einfach mit Defines. Das erste Beispiel initialisiert nur Index 4 des Arrays; das geht auch nicht einfach mit Defines.
– Jonathan Leffler
25. Februar 2013 um 15:26 Uhr
Es sollte auch beachtet werden, dass die mehrmalige Verwendung desselben Index die erste Verwendung mit der zweiten überschreibt – siehe meine Frage hier, zum Beispiel: stackoverflow.com/questions/16742467/…
– Johnny
24. Mai 2013 um 19:49 Uhr
Unterstützung für einzeilige Kommentare beginnend mit //.
Arrays variabler Länge:
int x;
scanf("%d", &x);
int a[x];
for (int i = 0; i < x; ++i)
a[i] = i * i;
for (int i = 0; i < x; ++i)
printf("%d\n", a[i]);
Glaubst du wirklich, dass VLA-Arrays so toll sind? C11 macht sie optional.
– Z-Boson
28. April 2015 um 8:13 Uhr
Vergessen Sie nur nicht, die Eingabebereinigung anzuwenden, um einen Stapelüberlauf (oder eine Stapelbeschädigung, wenn x negativ ist) zu verhindern: if (x < 0) x = 0; else if (x > 1024) x = 1024;
– Andrew D’Addesio
3. Januar 2016 um 4:13 Uhr
Variablen an anderen Stellen als am Anfang eines Blocks deklarieren können.
Glaubst du wirklich, dass VLA-Arrays so toll sind? C11 macht sie optional.
– Z-Boson
28. April 2015 um 8:13 Uhr
Vergessen Sie nur nicht, die Eingabebereinigung anzuwenden, um einen Stapelüberlauf (oder eine Stapelbeschädigung, wenn x negativ ist) zu verhindern: if (x < 0) x = 0; else if (x > 1024) x = 1024;
– Andrew D’Addesio
3. Januar 2016 um 4:13 Uhr
Variadische Makros. Erleichtert das Generieren von Boilerplate-Code mit einer unbegrenzten Anzahl von Argumenten.
14181900cookie-checkWas sind die nützlichsten neuen Funktionen in C99? [closed]yes
Es sollte ein ähnliches Wiki für Features geben, die Menschen hassen im C99!
– Alok Singhal
12. Januar 2010 um 6:25 Uhr
Nun, es gab eine Frage zu schädlichen oder nicht unterstützten C99-Funktionen stackoverflow.com/questions/1898890/…
– Brian Campell
12. Januar 2010 um 6:28 Uhr
Vielen Dank. Sie sollten den Linktext ändern, um anzuzeigen, dass es sich um einen Entwurf und nicht um den tatsächlichen Standard handelt, und auf n1256 verlinken, wenn Sie schon dabei sind :-). BTW, angeschaut gcc.gnu.org/c99status.html, würde ich nicht sagen, dass der größte Teil von C99 von gcc unterstützt wird. Und da gcc einer der am weitesten verbreiteten C-Compiler ist, …
– Alok Singhal
12. Januar 2010 um 6:33 Uhr
Beachten Sie, dass C99 im Bereich der eingebetteten Prozessoren möglicherweise immer noch nicht gut unterstützt wird.
– Craig McQueen
12. Januar 2010 um 6:50 Uhr
@Alok Ich würde dieses Maß an Unterstützung als die meisten Funktionen bezeichnen. Ich nehme an, es hängt davon ab, wie Sie es definieren, aber ich denke, dass die meisten wichtigen Funktionen, die Benutzer verwenden möchten, unterstützt werden, abgesehen von einigen Bibliotheksproblemen. @Craig Fair genug, fügte einen Haftungsausschluss zu eingebetteten Compilern hinzu.
– Brian Campell
12. Januar 2010 um 7:06 Uhr