Found this very helpful Q/A on SO: Is there any way to loop through a struct with elements of different types in C?
but since I am quite new to the whole X-Macro stuff,
You've got a reasonable start...
#include <stdio.h>
typedef unsigned char uint8;
enum { SIZEOF_ADDR = 3 };
#define X_FIELDS \
X(uint8, Addr1, "0x%02X") \
X(uint8, Addr2, "0x%02X") \
X(uint8, Addr3, "0x%02X")
//--- define the structure, the X macro will be expanded once per field
typedef struct {
#define X(type, name, format) type name[SIZEOF_ADDR];
X_FIELDS
#undef X
} TEST;
extern void iterate1(TEST *test);
extern void iterate2(TEST *test);
//--- Print the values
void iterate1(TEST *test)
{
const char *pad;
//--- "iterate" over all the fields of the structure
#define X(type, name, format) \
printf("%s is ", #name); \
pad = "{"; \
for (size_t i = 0; i < sizeof(test->name); i++) \
{ \
printf("%s" format, pad, test->name[i]); \
pad = ","; \
} \
printf("}\n");
X_FIELDS
#undef X
}
// Alternatively, define a function `print_addr()`
static void print_addr(const char *format, const uint8 *addr, size_t addrsize)
{
char pad = '{';
for (size_t i = 0; i < addrsize; i++)
{
putchar(pad);
printf(format, addr[i]);
pad = ',';
}
putchar('}');
}
//--- Print the values using print_addr()
void iterate2(TEST *test)
{
//--- "iterate" over all the fields of the structure
#define X(type, name, format) \
printf("%s is ", #name); \
print_addr(format, test->name, sizeof(test->name)); \
printf("\n");
X_FIELDS
#undef X
}
(This code, treated as a single file, is known to compile cleanly under GCC 4.7.1 on Mac OS X 10.7.5.)