如何在C语言数组中用数组索引初始化结构体成员?
C语言结构体二维数组的简洁初始化方案
现有数据结构
#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);
当前两种初始化方式
1. 逐个成员初始化(可行但冗长)
这种方式能正确把每个结构体的operation字段设为对应数组索引,但代码重复度极高,维护成本大:
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 } } };
2. 范围初始化(简洁但无法正确设置operation)
使用C的范围初始化语法能大幅简化代码,但所有结构体的operation字段会被设为固定值(如下示例中的0),无法自动匹配数组索引:
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 } } };
需求
是否存在一种简洁的初始化方式,能让operation字段自动初始化为对应的数组索引,类似如下伪代码的效果:
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 } } };
内容的提问来源于stack exchange,提问作者k8AspvNUfYhkvpT9EX5YCSzoLouT0
相关产品推荐
相关产品推荐

