繁体   English   中英

Static 初始化 C 数组中的结构成员

[英]Static initialization of struct members in a C array

假设我有以下数据结构:

#include <pthread.h>

#define MAX_OPERATIONS 8

typedef enum _dimension_t {
    LENGTH = 0,
    WIDTH  = 1,
    HEIGHT = 2,
    MAX_DIMENS = 3
} dimension_t;

typedef int (*write_fptr_t)(int);
typedef int (*read_fptr_t)(int *);

typedef struct _mydata_t {
    const dimension_t     dimension;
    const unsigned int    operation;
    const pthread_mutex_t lock;
    const write_fptr_t    wr_func_ptr;
    const read_fptr_t     rd_func_ptr;
    int                   x;
    int                   y;
    char                  data[8];
    float                 z;
    double                a;
} mydata_t;

extern int length_wr_fptr(int val);
extern int width_wr_fptr(int val);
extern int height_wr_fptr(int val);

extern int length_rd_fptr(int * val);
extern int width_rd_fptr(int * val);
extern int height_rd_fptr(int * val);

现在我想初始化一个 mydata_t 数组。 我可以做:

mydata_t mydata[MAX_DIMENS][MAX_OPERATIONS] = {
  {
    { LENGTH, 0, PTHREAD_MUTEX_INITIALIZER, length_wr_fptr, length_rd_fptr },
    { LENGTH, 1, PTHREAD_MUTEX_INITIALIZER, length_wr_fptr, length_rd_fptr },
    { LENGTH, 2, PTHREAD_MUTEX_INITIALIZER, length_wr_fptr, length_rd_fptr },
    { LENGTH, 3, PTHREAD_MUTEX_INITIALIZER, length_wr_fptr, length_rd_fptr },
    { LENGTH, 4, PTHREAD_MUTEX_INITIALIZER, length_wr_fptr, length_rd_fptr },
    { LENGTH, 5, PTHREAD_MUTEX_INITIALIZER, length_wr_fptr, length_rd_fptr },
    { LENGTH, 6, PTHREAD_MUTEX_INITIALIZER, length_wr_fptr, length_rd_fptr },
    { LENGTH, 7, PTHREAD_MUTEX_INITIALIZER, length_wr_fptr, length_rd_fptr }  },
  {
    { WIDTH,  0, PTHREAD_MUTEX_INITIALIZER, width_wr_fptr,  width_rd_fptr },
    { WIDTH,  1, PTHREAD_MUTEX_INITIALIZER, width_wr_fptr,  width_rd_fptr },
    { WIDTH,  2, PTHREAD_MUTEX_INITIALIZER, width_wr_fptr,  width_rd_fptr },
    { WIDTH,  3, PTHREAD_MUTEX_INITIALIZER, width_wr_fptr,  width_rd_fptr },
    { WIDTH,  4, PTHREAD_MUTEX_INITIALIZER, width_wr_fptr,  width_rd_fptr },
    { WIDTH,  5, PTHREAD_MUTEX_INITIALIZER, width_wr_fptr,  width_rd_fptr },
    { WIDTH,  6, PTHREAD_MUTEX_INITIALIZER, width_wr_fptr,  width_rd_fptr },
    { WIDTH,  7, PTHREAD_MUTEX_INITIALIZER, width_wr_fptr,  width_rd_fptr }  },
  {
    { HEIGHT, 0, PTHREAD_MUTEX_INITIALIZER, height_wr_fptr, height_rd_fptr },
    { HEIGHT, 1, PTHREAD_MUTEX_INITIALIZER, height_wr_fptr, height_rd_fptr },
    { HEIGHT, 2, PTHREAD_MUTEX_INITIALIZER, height_wr_fptr, height_rd_fptr },
    { HEIGHT, 3, PTHREAD_MUTEX_INITIALIZER, height_wr_fptr, height_rd_fptr },
    { HEIGHT, 4, PTHREAD_MUTEX_INITIALIZER, height_wr_fptr, height_rd_fptr },
    { HEIGHT, 5, PTHREAD_MUTEX_INITIALIZER, height_wr_fptr, height_rd_fptr },
    { HEIGHT, 6, PTHREAD_MUTEX_INITIALIZER, height_wr_fptr, height_rd_fptr },
    { HEIGHT, 7, PTHREAD_MUTEX_INITIALIZER, height_wr_fptr, height_rd_fptr }  }
};

这有效,但是很长。

或者,我可以这样做:

mydata_t mydata[MAX_DIMENS][MAX_OPERATIONS] = {
    { [0 ... MAX_OPERATIONS-1] = { LENGTH, 0, PTHREAD_MUTEX_INITIALIZER, length_wr_fptr, length_rd_fptr } },
    { [0 ... MAX_OPERATIONS-1] = { WIDTH,  0, PTHREAD_MUTEX_INITIALIZER, width_wr_fptr,  width_rd_fptr  } },
    { [0 ... MAX_OPERATIONS-1] = { HEIGHT, 0, PTHREAD_MUTEX_INITIALIZER, height_wr_fptr, height_rd_fptr } }
};

这更短,但操作字段没有正确初始化。

问题:有没有办法将成员变量初始化为数组索引? 就像是?

mydata_t mydata[MAX_DIMENS][MAX_OPERATIONS] = {
    { [0 ... MAX_OPERATIONS-1] = { LENGTH, ##INDEX##, PTHREAD_MUTEX_INITIALIZER, length_wr_fptr, length_rd_fptr } },
    { [0 ... MAX_OPERATIONS-1] = { WIDTH,  ##INDEX##, PTHREAD_MUTEX_INITIALIZER, width_wr_fptr,  width_rd_fptr  } },
    { [0 ... MAX_OPERATIONS-1] = { HEIGHT, ##INDEX##, PTHREAD_MUTEX_INITIALIZER, height_wr_fptr, height_rd_fptr } }
};

或许:

#define MINIT(n) [LENGTH][n] = { LENGTH, n, PTHREAD_MUTEX_INITIALIZER, length_wr_fptr, length_rd_fptr },\
                 [WIDTH][n] = { WIDTH,  n, PTHREAD_MUTEX_INITIALIZER, width_wr_fptr,  width_rd_fptr },\
                 [HEIGHT][n] = { HEIGHT, n, PTHREAD_MUTEX_INITIALIZER, height_wr_fptr, height_rd_fptr }\


mydata_t mydata[MAX_DIMENS][MAX_OPERATIONS] =  
     { MINIT(0), MINIT(1), MINIT(2), MINIT(3), 
       MINIT(4), MINIT(5), MINIT(6), MINIT(7)}; 

https://godbolt.org/z/33ehP563W

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM