Du kannst aber immerhin dir viel Tipparbeit sparen, nach dem Muster des Beispiels hier:
http://gcc.gnu.org/onlinedocs/cpp/Concatenation.html
Was mich eher wundert ist das Design. Reflection zu brauchen ist in C eher ungewöhnlich. Wozu? Außerdem scheinen die Felder global zu sein. Super böse. Hier liegen die wahren Ansätze, wie du dein Programm verbessern kannst. Wir können dir dabei helfen. Also nimm bitte möglichst nicht die Makrolösung sondern beschreib mal genau, warum du glaubst, so ein Konstrukt überhaupt zu benötigen und warum alles global ist.
Eine kleine Schwäche ist noch, dass du die Typen hardcodiert hast, was auch nicht toll ist. sizeof(X)/sizeof(int) -> sizeof(X)/sizeof(*X) . Eine ganz einfache Änderung, aber schon ist das ohne jeden Nachteil viel flexibler gegenüber Wartungsarbeiten und Änderungen.
Wozu ist überhaupt ar da?
Bei const int * als Rückgabewert wird mir auch Angst und Bange. Das ist fast garantiert ein grober Fehler!
inline scheint auch nicht unbedingt angebracht für solch eine Monsterfunktion. Die hat nichts in Headern zu suchen. Das ist auch keine universelle Hilfsfunktion, die man auch mal Header-only implementieren kann, da sie ganz speziell für dein Programm ist.
Du siehst, hier sind noch sehr viele Baustellen. Alle sind sie wesentlich dringender als deine eigentliche Frage. Kümmere dich um diese Fehler zuerst! Besonders der Ruckgabewert ist fatal. Und die Frage danach, wozu das ganze eigentlich gut sein soll.