hailinzeng hailinzeng - 1 month ago 7
C Question

C macro to unroll fixed sized array declaration, rename each with index suffix

Is it possible to define a macro

INPUT_ARR
, so that
int a[4]; void (INPUT_ARR(int, a, 4)){}
equals to
void (int a0, int a1, int a2, int a3){}

M.M M.M
Answer

Here's one way:

#define INPUT_ARR(type, name, count) IARR ## count (type, name)

#define IARR0(type, name)
#define IARR1(type, name) type name##0
#define IARR2(type, name) IARR1(type, name), type name##1
#define IARR3(type, name) IARR2(type, name), type name##2
#define IARR4(type, name) IARR3(type, name), type name##3

void func (INPUT_ARR(int, a, 4)){}

int main()
{
    func(1,2,3,4);
}

Results of gcc -E (excluding main):

void func (int a0, int a1, int a2, int a3){}

You'll need to add IARR lines up until the max count that you want to support. It's not possible to have recursive macro definitions that go on automatically.