【问题标题】:Compilation error when printing array elements in a X-Macro在 X-Macro 中打印数组元素时出现编译错误
【发布时间】:2018-10-15 14:27:13
【问题描述】:

我在使用 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);

}

不知道为什么,但是在编译时,我收到以下错误:

编译器无法看到 arr1arr2 的地方,前提是我能够在预处理器文件中看到这两者。以下是预处理器的输出:

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]); }
}

知道我做错了什么吗?

【问题讨论】:

    标签: c arrays x-macros


    【解决方案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]); \
      }
    

    【讨论】:

    • 谢谢,我不知道我怎么这么傻,差点忘了它在一个结构里面。感谢您指出:)
    • 宏使你的代码更难阅读——没有它们你会更好。
    • 同意,但我正在努力寻找解决办法; stackoverflow.com/questions/51875995/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-02
    • 1970-01-01
    • 1970-01-01
    • 2013-11-10
    • 2021-06-15
    • 1970-01-01
    相关资源
    最近更新 更多