使用C++17编译时如何抑制strftime的ISO C++11不支持警告?
问题原因
你使用的%04Y格式中的0前导填充标志是POSIX扩展特性,并不属于ISO C标准(包括C11到C17)规定的strftime格式语法。你的编译命令里添加了-Wpedantic,这个选项会强制检查所有不符合C标准的扩展用法,再配合-Werror就把该合规性警告直接转成了编译错误。g++ 8.5.0在-Wpedantic模式下对标准的严格性检查会触发这个问题。
抑制警告/解决方法
有几种可行的处理方式:
- 改用标准兼容写法:ISO C++标准中
%Y本身就要求输出4位年份,默认用前导零填充。你可以直接把格式字符串改成"%a %d %b %4Y"甚至"%a %d %b %Y",两者效果和%04Y完全一致,且符合标准,不会触发警告。 - 局部抑制pedantic警告:如果一定要保留
%04Y,可以在使用strftime的代码段前后添加GCC特有的编译指令,只抑制这部分的pedantic警告:#pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wpedantic" strftime(buffer, sizeof(buffer), "%a %d %b %04Y", &timeinfo); #pragma GCC diagnostic pop - 全局关闭特定警告:在编译命令里添加
-Wno-pedantic可以关闭所有pedantic相关的警告,但这会同时忽略其他不符合标准的代码问题,不推荐除非你确实不需要严格的标准检查。
内容的提问来源于stack exchange,提问作者Kevin Truong
相关产品推荐
相关产品推荐

