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?

Als Referenz, dem C99-Standard (als Entwurf gekennzeichnet, aber meines Wissens identisch mit dem aktualisierten Standard), die Liste der neuen Funktionenund die GCC C99-Implementierungsstatus.

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.

struct { int x, y; } a[10] = { [3] = { .y = 12, .x = 1 } };

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:

enum { Iron = 26, Aluminium = 13, Beryllium = 4, ... };

const char *element_names[] =
{
    [Iron]      = "Iron",
    [Aluminium] = "Aluminium",
    [Beryllium] = "Beryllium",
    ...
};

  • 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.

1418190cookie-checkWas sind die nützlichsten neuen Funktionen in C99? [closed]

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy