有没有办法修复 stdint 类型的格式说明符警告?
Posted
技术标签:
【中文标题】有没有办法修复 stdint 类型的格式说明符警告?【英文标题】:Is there a way to fix format specifiers warnings for stdint types? 【发布时间】:2015-07-26 22:19:52 【问题描述】:问题是在一个平台(windows,mvsc2015)uint64_t
被定义为 unsigned long long
而在另一个(ubuntu,clang)它是 unsigned long
并且代码看起来像
sprintf(buffer, "%#llx", u64key);
【问题讨论】:
【参考方案1】:解决方案是使用 C99 的格式宏,特别是 PRIu64
用于 uint64_t
:
#include <inttypes.h>
…
sprintf(buffer, "%#" PRIu64 "\n", u64key);
【讨论】:
【参考方案2】:Pascal 的解决方案是这种特定类型最直接和最惯用的解决方案,但为了记录,打印您不知道其定义的任意整数类型的替代方法是简单地转换为 intmax_t
或 uintmax_t
然后使用j
修饰符(例如 %jd
或 %ju
)。然而,这可能不适用于大多数/所有版本的 MSVC 标准库实现,因为它们在标准一致性方面远远落后。
【讨论】:
@melpomene 缺少示例。 @WeatherVane 认真的吗?如果有人告诉您“将 x 乘以 3,然后加 1”,您是否还会要求提供示例,因为除非您可以从 SO 复制/粘贴x*3 + 1
,否则您绝对无法编写代码?
@WeatherVane 如果您的编译器没有inttypes.h
,您可以包含stdint.h
,它可能会有。但是,OP 没有指定 MSVC 版本,因此,因为它是 2015 年,我们必须假设一个实现了大部分 C99 的版本。请注意,该问题假设 uint64_t
可以从某处甚至在 MSVC 上使用。
@WeatherVane ...所以你首先没有uint64_t
。那你为什么要担心打印一个呢? i.imgur.com/x6AnRkL.png?fb
IIRC,intmax_t
已添加到 C99,这也需要 inttypes.h
。那么,如果编译器不支持 C99,如何假设它提供了intmax_t
和相应的格式说明符?请注意intmax_t
本身在stdint.h
中的定义与int32_t
和朋友一样多。【参考方案3】:
您可以使用预处理器指令来检测数据类型的定义方式并使用不同的字符串编译另一个 sprintf()。
【讨论】:
“使用预处理器指令来检测数据类型是如何定义的” - ... 如何?以上是关于有没有办法修复 stdint 类型的格式说明符警告?的主要内容,如果未能解决你的问题,请参考以下文章
在 C 中,如何修复此警告:格式“%s”需要“char *”类型的参数,但参数 3 的类型为“char (*)[100]
有没有办法修复错误:替换现有签名警告:无法为签名者构建自签名根的链(xamarin iOS)
有没有办法在自定义 System.Security.IPermission 实现上修复此 FxCop CA2103 警告?