The macros allow the compiler to properly decode where arguments are found in memory when calling a function.
In the simplest, basic case, they are pushed in order onto the stack. The macros can then take the address of the first argument (the required one), then do some pointer addition to find each additional argument. Again, exactly how this works depends on a lot of things, including compiler options. Hence the very special case of the macros.