Ein Blog

Es ist komplett an mir vorbei gegangen, dass C23 verabschieded wurde.

Meine Highlights:

  • signed Integer sind jetzt definiert als Zweierkomplement
  • #embed, womit man Rohdaten aus anderen Dateien inkludieren kann, z. B. in einem C-Array. Das wird so einige Buildprozesse vereinfachen.
  • Enums können jetzt einen zugrundeliegenden Typen haben: enum e : unsigned short { x };
  • Es gibt jetzt nullptr (und nullptr_t) auch in C
  • true und false sind jetzt Keywords
  • 0b-Literale

Außerdem gibt es noch bessere Kompatibilität zwischen gleichförmigen Structs. Mit N3003 wird dieser Generics-Hack nun viable (Codebeispiel von Reddit übernommen):

#include <stdio.h>
#include <stdlib.h>

#define Vec(T) struct Vec__##T { T *at; size_t _len; }

#define vec_push(a,v) ((a)->at = realloc((a)->at, ++(a)->_len), (a)->at[(a)->_len - 1] = (v))
#define vec_len(a) ((a)._len)

void fill(Vec(int) *vec) {
    for (int i = 0; i < 10; i += 2)
        vec_push(vec, i);
}

int main() {
    Vec(int) x = { 0 }; // or = {} in C2x
    // pre C2x you'd need to typedef Vec(int) to make the pointers compatible and use it for `x` and in fill:
    // --v
    fill(&x);
    for (size_t i = 0; i < vec_len(x); ++i)
        printf("%d\n", x.at[i]);
}

Auf cppreference gibt es auch noch eine kleine Übersicht der Änderungen.