В сети есть статьи о символьных вычислениях на стадии предварительной обработки, типичным примером будет http://jhnet.co.uk/articles/cpp_magic
Если определенный механизм слишком велик для вас, и вас не волнует красивостьсгенерированного кода вы могли бы использовать дешевую альтернативу, что-то вроде (не проверено):
#define ONE_MEM(i, a) MemType mem_ ## a[MAX_MEM]; mem[i] = mem_ ## a
#define MEM_1(i, a) ONE_MEM(i, a); ONE_MEM(i + 1, a ## 1)
#define MEM_2(i, a) MEM_1(i, a); MEM_1(i + 2, a##2)
#define MEM_4(i, a) MEM_2(i, a); MEM_2(i + 4, a##4)
и т. д., теперь это логарифмическое количество заданных макросов.
(еще не проверялфактическому определению может потребоваться косвенное косвенное указание или два.)
Могут быть улучшения, например, объявление макропараметра вместо mem
и т. д.