如何在C++中创建并赋值DATE(div_t)类型数组?
问题背景
项目中使用的DATE类型定义如下:
typedef div_t DATE; #define ans quot /* (s)(l)div_t : .quot -> .ans... */ #define mois rem /* ... et .rem -> .mois : plus parlant */
DATE本质是div_t结构体类型,其中quot(或宏ans)用于存储年份,rem(或宏mois)用于存储月份。
需要创建DATE类型数组,但在赋值时遇到多种错误,包括结构体成员赋值语法错误、重复定义数组导致的编译报错。
错误尝试示例
以下赋值写法均无法正常工作:
DATE tx_tech_variable_dates_vec[8] = {0, 0}; /* code testing */ // 错误:单个结构体成员不能用花括号赋值 DATE tx_tech_variable_dates_vec[0].quot = { 2026, 06 }; DATE tx_tech_variable_dates_vec[0].rem = { 2026, 06 }; // DATE tx_tech_variable_dates_vec[1].ans = { 2026, 07 }; // DATE tx_tech_variable_dates_vec[1].mois = { 2026, 07 }; // 错误:不能在数组定义后用DATE重声明单个元素 DATE tx_tech_variable_dates_vec[1] = { 2032, 06 };
另一种写法触发编译错误:
double tx_tech_variable_vec[8] = { 0 }; tx_tech_variable_vec[0] = 3.0; tx_tech_variable_vec[1] = 1.5; DATE tx_tech_variable_dates_vec[8] = { 0, 0 }; DATE tx_tech_variable_dates_vec[1] = { 2026, 07 }; // 触发C2369错误
错误信息:
Line Severity Code Description Project File Suppression State
4680 Error C2369 'tx_tech_variable_dates_vec': redefinition; different subscripts
正确解决方案
由于不能修改DATE类型定义或引入新容器,需遵循C语言结构体数组的赋值规则:
1. 数组初始化时直接赋值
在数组定义阶段,通过结构体初始化列表为元素赋值,支持使用项目宏别名ans/mois或原始成员名quot/rem:
// 使用原始成员名 DATE tx_tech_variable_dates_vec[8] = { {.quot = 2026, .rem = 6}, {.quot = 2026, .rem = 7}, // 剩余元素自动初始化为0 }; // 使用宏别名,贴合现有代码风格 DATE tx_tech_variable_dates_vec[8] = { {.ans = 2026, .mois = 6}, {.ans = 2026, .mois = 7}, // 剩余元素默认初始化为0 };
2. 数组创建后逐个元素赋值
数组定义完成后,直接通过下标访问结构体成员赋值,无需重复声明DATE:
DATE tx_tech_variable_dates_vec[8] = {0}; // 初始化所有元素为0 // 使用原始成员名赋值 tx_tech_variable_dates_vec[0].quot = 2026; tx_tech_variable_dates_vec[0].rem = 6; // 使用宏别名赋值(推荐,和项目现有代码风格一致) tx_tech_variable_dates_vec[1].ans = 2026; tx_tech_variable_dates_vec[1].mois = 7;
C2369错误说明
该错误是因为数组定义后,又用DATE tx_tech_variable_dates_vec[1]重复声明数组,编译器判定为重复定义且下标不一致。正确做法是像double数组赋值那样,直接访问数组元素(去掉前缀DATE)进行赋值。
内容的提问来源于stack exchange,提问作者babipsylon
相关产品推荐
相关产品推荐

