我正在尝试使用宏来初始化结构数组的所有数组参数,其中一个参数是数组。
我的结构是
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)
}
然而,这总是失败并且我不断收到错误"错误:围绕类型"的标量初始化器。任何帮助将不胜感激。
答案 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))}