在函数里这样写对吗stCalc->stStitchingRule={.segment_count = 3, .segment_starts = {0, 336, 900}, .segment_lengths = {300, 100, 112}, .stitched_total_length = 512};
问题分析
在C语言中,直接在函数内对结构体成员(如 stCalc->stStitchingRule)使用复合字面量(Compound Literal)进行赋值(如 {...})是不合法的语法。以下是详细分析和正确写法:
1. 问题分析
错误原因
C语言不允许在赋值时直接对结构体成员使用复合字面量(C99引入的复合字面量只能用于初始化或单独赋值)。
你的写法会触发编译错误:
stCalc->stStitchingRule = {.segment_count = 3, ...}; // 错误!
复合字面量的正确用法
复合字面量需独立使用,例如:
StitchingRule_ST rule = {.segment_count = 3, ...}; // 初始化
stCalc->stStitchingRule = rule; // 赋值
2. 正确写法
方法1:逐成员赋值
stCalc->stStitchingRule.segment_count = 3;
stCalc->stStitchingRule.segment_starts[0] = 0;
stCalc->stStitchingRule.segment_starts[1] = 336;
stCalc->stStitchingRule.segment_starts[2] = 900;
stCalc->stStitchingRule.segment_lengths[0] = 300;
stCalc->stStitchingRule.segment_lengths[1] = 100;
stCalc->stStitchingRule.segment_lengths[2] = 112;
stCalc->stStitchingRule.stitched_total_length = 512;
方法2:使用临时变量(C99复合字面量)
StitchingRule_ST temp = {
.segment_count = 3,
.segment_starts = {0, 336, 900},
.segment_lengths = {300, 100, 112},
.stitched_total_length = 512
};
stCalc->stStitchingRule = temp; // 合法赋值
方法3:动态初始化(C99复合字面量 + 直接赋值)
stCalc->stStitchingRule = (StitchingRule_ST) {
.segment_count = 3,
.segment_starts = {0, 336, 900},
.segment_lengths = {300, 100, 112},
.stitched_total_length = 512
};
注意:此写法需编译器支持C99或更高标准(常见于现代嵌入式编译器如GCC、Clang)。
3. 为什么你的写法不合法?
C语言的语法规定,复合字面量(如 {...})只能用于:
变量初始化(如 Type var = {...};)。
直接赋值给相同类型的变量(如 var = (Type){...};)。
不能直接在结构体成员赋值时使用 {...}。