[英]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)};
问题未解决?试试以下方法:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.