Yes, ADTs in C can be made in two ways - where first uses `void *` for the "generic type".
| struct array {u32 count; void * items;};
|
Then using macro or function
array_at(array,index,element_size) to do the pointer arithmetic.
The second way to do ADTs is ginormous macros - one for the structure definition and one for implementation code. And everytime you'd need a new data struct you would just expand the macros with the necessary types inserted.
The giant macros one is the only one which can be optimized by the compiler - but is a giant pain in the ass to debug and work with.
Sean Barrett's stretchy_buffer approach is a nice macro/pointer hack which works surprisingly nicely for "dynamic arrays".
It still doesn't do range-checks (and has some drawbacks), but is it VERY, VERY useful!
While the talk was discussing both meanings of the word "typing" (as in strong typing), the part of the talk I was referencing was the one where he was telling how "typing in code" or having to type large amounts of code to do simple things is not a problem in C.
I totally don't agree that C lack of expressibility - or having 100 lines to do simple things (where it could have been 10-30 lines) - is not a problem. Having loads of code is always a problem.
Large parts of game code are not actually complicated and are straight forward busywork coding.
Since all of it is prone to blowing up randomly (yay stack and heap corruption), it's not fun at.
Making games in C is just giant pain in the ass - for all the wrong reasons.