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
(undnullptr_t
) auch in C true
undfalse
sind jetzt Keywords0b
-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.