C dynamic array implementation using preprocessor
Here are some things that may help you improve your code.

Use the appropriate #includes

This program requires two headers, both of which should be included:

#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;


Check the return value of malloc

If the program runs out of memory, a call to malloc (or realloc) can fail.  The indication for this is that the call will return a NULL pointer.  You should check for this and avoid dereferencing a NULL pointer (which typically causes a program crash).  

Don't leak memory

This code leaks memory.  To begin with, the code calls malloc but there is no corresponding call to free.  For a usable general list, there should be something akin to list_destroy().

Be careful with multiline macros

Multiline macros can have odd effects if you're not careful. For instance, if we do this:

for (int i=10; i &lt; 70; ++i)
    list_append(arr, i);


The effect is that the if part of list_append is only executed once rather than once per iteration.  This can be fixed by wrapping all multiline macros in their own block by enclosing them in curly braces.  This will, however, have the side effect of no longer requiring a terminating semicolon if that matters to you.