Ein Blog

Posts mit Tag "c"

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.

Für eine Mittagspause: John Regehr’s “Integers in C quiz”.

Man sollte ja eigentlich immer calloc statt malloc verwenden. Das häufigste Argument ist, dass man bei calloc immer genullten Speicher bekommt, was man bei malloc erst von Hand nachbauen muss (viele aber dann einfach nicht machen). Hier sind noch zwei weitere Argumente: Why does calloc exist?

Kleiner Hack: Coroutines in C

Das Buch Modern C hat ein Update für C23 bekommen.

Ein Proposal für C (N3317): Essential Effects for C

V8 verwendet ja Pointer Tagging, um optimiert mit Zahlen zu arbeiten. Wer sowas selbst mal einsetzen will: Pointer Tagging in C++: The Art of Packing Bits Into a Pointer