Ошибка компиляции при печати элементов массива в X-Macro

У меня есть следующий код, где я использую x-macro:

#define X_FIELDS  \
     X(int,        var1) \
     X(uint8_t,    var3) \
     X(uint16_t,   var4) \
     XA(uint8_t,   arr1, 4) \
     XB(char,      arr2, 2)

typedef struct {
#define X(type, name) type name;
#define XA(type, name, count) type name[count];
#define XB(type, name, count) type name[count];
    X_FIELDS
#undef X
#undef XA
#undef XB
} myStruct;

и функция для печати значений:

void print(myStruct *aStruct)
{
  int i;
#define X(type, name) printf("mystruct.%s is %d\n", #name, aStruct->name);
#define XA(type, name, count) \
  for (i=0; i < count; i++) { \
      printf("element = %u\n", name[i]); \
  }
#define XB(type, name, count) \
  for (i=0; i < count; i++) { \
      printf("element = %c\n", name[i]); \
  }
X_FIELDS
#undef X
#undef XA
#undef XB
}

и основная функция:

int main() {
  myStruct a = {.var1 = 23, .var4 = 12, .arr1 = {32,15,22,11} };
  print(&a);

}

Не знаю почему, но при компиляции я получаю следующую ошибку: введите здесь описание изображения

где компилятор не может видеть arr1 и arr2 при условии, что я могу видеть оба в файле препроцессора. Ниже приведен вывод препроцессора:

typedef struct {
    int var1; uint8_t var3; uint16_t var4; uint8_t arr1[4]; char arr2[2];
} myStruct;

void print(myStruct *aStruct)
{
  int i;
# 44 "C:\\Users\\akumar8\\CodeBlockWorkspace\\myTest\\myTest\\main.c"
printf("mystruct.%s is %d\n", "var1", aStruct->var1); printf("mystruct.%s is %d\n", "var3", aStruct->var3); printf("mystruct.%s is %d\n", "var4", aStruct->var4); for (i=0; i < 4; i++) { printf("element = %u\n", arr1[i]); } for (i=0; i < 2; i++) { printf("element = %c\n", arr2[i]); }
}

Любая идея, что я делаю неправильно?


person Akay    schedule 15.10.2018    source источник


Ответы (1)


Как вы можете видеть в выводе препроцессора, name в вашем макросе оценивается как arr1 — он не знает, что он является частью aStruct.

#define XA(type, name, count) \
  for (i=0; i < count; i++) { \
      printf("element = %u\n", name[i]); \
  }

Для строк, которые работают, вы включаете структуру aStruct в макрос

#define X(type, name) printf("mystruct.%s is %d\n", #name, aStruct->name);

Таким образом, вы также должны сделать то же самое здесь, как это

#define XA(type, name, count) \
  for (i=0; i < count; i++) { \
      printf("element = %u\n", aStruct->name[i]); \
  }
person Chris Turner    schedule 15.10.2018
comment
Спасибо, я не знаю, как я могу быть настолько глупым, что почти забыл, что это внутри структуры. Спасибо, что указали :) - person Akay; 15.10.2018
comment
Макросы значительно усложняют чтение кода — без них было бы лучше. - person Chris Turner; 15.10.2018
comment
Согласен, но я пытаюсь найти способ к этому; stackoverflow.com/questions/51875995/ - person Akay; 15.10.2018