簡體   English   中英

使用帶有數組參數的宏在C中初始化結構數組

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM