使用带有数组参数的宏在C中初始化结构数组

时间:2018-04-19 15:42:15

标签: c arrays

我正在尝试使用宏来初始化结构数组的所有数组参数,其中一个参数是数组。

我的结构是

typedef struct
{
  int size_parts;
  int *parts;
  int width;
  int length;
} parts_struct;

我的宏被定义为

#define SET_ARRAY_INPUT(_width, _length, ...) {width:_width, length:_length, parts:{__VA_ARGS__}, size_parts:(sizeof((int[]){__VA_ARGS__})/sizeof(int))}

我的数组初始化为

static parts_struct parts[] = {
   SET_ARRAY_INPUT(2, 3, 9354, 39458, 3294),
   SET_ARRAY_INPUT(4, 2, 9354, 3294)
}

然而,这总是失败并且我不断收到错误"错误:围绕类型"的标量初始化器。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:1)

在你的宏中,你正在尝试初始化像数组一样的指针:

parts:{__VA_ARGS__}

您需要将复合文字语法添加到此:

parts:(int []){__VA_ARGS__}

答案 1 :(得分:1)

在标准C(C99或C11)中,结构中的指定初始值设定项前面有.并使用=而不是:。你可能会设法得到这样的东西:

#define SET_ARRAY_INPUT(_width, _length, ...) \
    { .width = (_width), .length = (_length), \
      .parts = (int []){__VA_ARGS__}, \
      .size_parts = (sizeof((int[]){__VA_ARGS__})/sizeof(int))}

请注意,Designated Initializers上的GCC手册页指出:

  

具有相同含义的另一种语法,自GCC 2.5以来已过时,为fieldname:,如下所示:

struct point p = { y: yvalue, x: xvalue };

因此,下面显示的替代定义确实有效(令我非常惊讶),但它是一个GCC扩展,已经在很长一段时间内正式废弃(GCC releases页面说GCC 2.5.0发布于1993-10-22; GCC 2.5.8发布于1994-01-24; GCC 2.6.0发布于1994-07-14) - 不应用于新的或翻新的代码:

#define SET_ARRAY_INPUT(_width, _length, ...) \
    { width: (_width), length: (_length), \
      parts: (int []){__VA_ARGS__}, \
      size_parts: (sizeof((int[]){__VA_ARGS__})/sizeof(int))}