[英]Initializing an array of structs in C using Macros with an array parameter
我正在嘗試使用宏來初始化結構數組的所有數組參數,其中參數之一是數組。
我的結構是
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)
}
但是,這總是失敗,並且我不斷收到錯誤“錯誤:類型的標量初始值設定項周圍的花括號”。 任何幫助將不勝感激。
在您的宏中,您嘗試初始化類似數組的指針:
parts:{__VA_ARGS__}
您需要為此添加復合文字語法:
parts:(int []){__VA_ARGS__}
在標准C(C99或C11)中,結構中指定的初始值設定項后面帶有a .
並用=
代替:
。 您可能設法使類似的東西起作用:
#define SET_ARRAY_INPUT(_width, _length, ...) \
{ .width = (_width), .length = (_length), \
.parts = (int []){__VA_ARGS__}, \
.size_parts = (sizeof((int[]){__VA_ARGS__})/sizeof(int))}
請注意,“ 指定的初始化程序”的GCC手冊頁指出:
自GCC 2.5起已經過時的另一種具有相同含義的語法是
fieldname:
如下所示:struct point p = { y: yvalue, x: xvalue };
因此,下面顯示的替代定義確實起作用了(令我驚訝的是),但是它是GCC擴展,在很長一段時間內正式被淘汰(GCC 發布頁面上說GCC 2.5.0於1993-10-22發布; GCC 2.5.8於1994年1月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))}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.