使用UCRT版MinGW-w64编译sox时FILE无_ptr/_base成员的解决方案问询
问题根因
原rewind_pipe函数直接访问FILE结构体的_ptr、_base私有成员,属于依赖CRT内部实现的非标准用法。UCRT(通用C运行时)对标准库内部结构做了封装,隐藏了这些内部成员,因此触发编译报错。
解决方案
方案1:直接移除未使用函数(改动最小,优先推荐)
原函数定义带UNUSED标记,说明该函数在当前代码中没有任何调用逻辑,直接删除整个函数即可,不会影响sox的正常功能,也能完全解决编译报错问题。
方案2:条件编译适配多CRT环境
如果后续可能用到该函数的回绕功能,可修改实现为兼容UCRT的版本:
static void UNUSED rewind_pipe(FILE * fp) { #if !defined(_UCRT) // 非UCRT环境保留原有逻辑 fp->_ptr = fp->_base; #else // UCRT环境使用标准C接口实现缓冲区回绕 fpos_t start_pos = 0; fsetpos(fp, &start_pos); #endif }
注:如果操作对象是不可寻址的管道流,标准
fsetpos/rewind调用会返回错误。如果业务场景需要清空已读入用户态缓冲区的内容,Windows平台下可改用fflush(fp)实现,符合原有逻辑预期。
方案3:条件编译屏蔽UCRT下的函数定义
如果确认该函数不会被调用,也可以用宏判断包裹整个函数实现,仅在非UCRT环境下保留该函数:
#if !defined(_UCRT) static void UNUSED rewind_pipe(FILE * fp) { fp->_ptr = fp->_base; } #endif
内容的提问来源于stack exchange,提问作者Brecht Sanders
相关产品推荐
相关产品推荐

