Windows下MinGW gcc-7.2.0中fprintf参数索引格式说明符失效
问题原因与解决办法
为什么参数索引格式说明符不工作?
你碰到的问题根源在于MinGW默认绑定微软的msvcrt.dll作为C标准库,这个库的printf系列函数(包括fprintf)并不支持POSIX风格的参数索引格式(也就是%1$d这类语法)。当msvcrt的fprintf解析%1$d时,会把$当成普通字符处理,所以最终输出就变成了$d == $d。
另外补充一点:C89标准本身并没有定义参数索引的格式说明符,这是POSIX标准的扩展特性,只有支持该扩展的C标准库才能正确解析这种格式。
如何让参数索引格式说明符正常工作?
最直接的解决办法是在编译时添加一个宏定义,让MinGW使用自身实现的符合ANSI/POSIX标准的stdio函数,而非依赖msvcrt.dll的版本。具体操作如下:
修改编译命令,加入-D__USE_MINGW_ANSI_STDIO=1选项:
gcc -Wall -std=c89 -D__USE_MINGW_ANSI_STDIO=1 -o main.exe main.c
编译完成后运行程序,就能得到预期的输出:
10 == 10
额外说明
如果你使用的是MinGW-w64,也可以选择切换到ucrt(Universal C Runtime)作为标准库,它原生支持POSIX的参数索引格式。不过上面的宏定义方法更通用,不管是传统MinGW还是MinGW-w64都能生效。
内容的提问来源于stack exchange,提问作者user5955745
相关产品推荐
相关产品推荐

