使用fpos_t时出现“应为整数却使用聚合值”编译错误求助
解决“aggregate value used where an integer was expected”错误
这问题我太熟悉了!你碰到的是fpos_t类型的典型坑——它不是简单的整数类型,而是一个聚合类型(通常是结构体),所以直接把它强制转换为char时,编译器会报错“应为整数却使用了聚合值”,因为它不知道该怎么把一个结构体转成单个字符。
问题根源分析
你代码里的flen是fpos_t类型,这个类型是C标准用来表示文件偏移量的,设计初衷是支持大文件(超过long范围的文件大小),所以很多系统会把它实现成结构体,而不是基础整数类型。直接对结构体做强制类型转换和位运算,编译器肯定不买账。
解决方案:获取整数类型的文件长度
要实现你原本的逻辑(把文件长度的低4位替换到inbuf[0]的低4位,保留高4位),你需要先把文件偏移量转换成标准的整数类型,比如off_t(这是系统用来表示文件大小的整数类型,支持大文件)。
修改步骤如下:
- 用标准函数获取整数类型的文件长度
- 再对这个整数值做位运算操作
修改后的代码示例:
int encfile(FILE *fin, FILE *fout, aes *ctx, char* fn) { char inbuf[16], outbuf[16]; off_t file_len; // 改用off_t类型存储文件长度 // 移动文件指针到末尾获取长度 fseeko(fin, 0, SEEK_END); file_len = ftello(fin); fseeko(fin, 0, SEEK_SET); // 移回文件开头,继续后续加密操作 fillrand(inbuf, 1); // 现在用整数类型的file_len做位运算,不会报错 inbuf[0] = ((char)(file_len & 15)) | (inbuf[0] & ~15); // ... 剩余代码 }
额外说明
如果你坚持要用fpos_t,有些系统的fpos_t结构体里会有一个整数成员(比如__pos)可以直接访问,但这是非标准实现,换个系统就可能失效,强烈不推荐。还是用ftello和fseeko这种标准函数,代码的移植性更好。
内容的提问来源于stack exchange,提问作者Dileesh Dil
相关产品推荐
相关产品推荐

