This is very smart (but see below).
He encourages the misleading idea that arguments to the C function can be passed by reference.
If I see this in a C program:
foo bar; foo_init(bar);
I know that calling foo_init does not change the value of bar . I also know that the code passes the bar value to the function if it did not initialize it, which is probably undefined behavior.
If I do not know that foo is a typedef for an array type. Then I suddenly realize that foo_init(bar) does not pass the value of bar , but the address of its first element. And now every time you see something that is of type foo or an object of type foo , I have to think about how foo was defined as typedef for a singleton array before I can understand the code.
This is an attempt to make C look like something similar, not like things like:
#define BEGIN { #define END }
etc. And this does not make the code easier to understand, since it uses functions that C does not directly support. This leads to a more complicated understanding of the code (especially for readers who know C well), because you need to understand both the customized declarations and the basic C semantics that make it all work.
If you want to pass pointers, just skip the pointers around and do it explicitly. See, for example, the use of FILE* in various standard functions defined in <stdio.h> . There is no attempt to hide pointers behind macros or typedefs, and C programmers have been using this interface for decades.
If you want to write code that looks like passing arguments by reference, define some macros, similar functions, and give them the names of all the caps so that knowledgeable readers know that something strange is happening.
I said above that it is "smart." I was reminded of something that I did when I first learned the C language:
#define EVER ;;
which allow me to write an infinite loop like:
for (EVER) { }
At that time I thought it was smart.
I still find it smart. I just don't think that is good anymore.