gpt4 book ai didi

c++ - C printf跨平台格式无警告

转载 作者:行者123 更新时间:2023-11-30 20:10:18 25 4
gpt4 key购买 nike

如何编写跨平台编译代码而不出现警告。例如,我在 x64 平台上没有收到警告,但在 ARM (raspberry PI) 上却收到警告:

警告:格式“%lu”需要“long unsigned int”类型的参数,但参数 5 的类型为“size_t {aka unsigned int}”

不用说我不想禁用警告。

更多示例和场景:

warning: format ‘%lu’ expects argument of type ‘long unsigned int’, 
but argument 5 has type ‘uint64_t {aka long long unsigned int}’

uint64_t Created; // 8 bytes
time_t now = time(NULL);
"Current time: %li sec, %lu nanosecs", now, msg.Created

size_t 可能是罪魁祸首:

sizeof的基本用法:

warning: format ‘%lu’ expects argument of type ‘long unsigned int’, 
but argument 4 has type ‘unsigned int’
tr_debug("pbJobs size: %lu", sizeof(pbJobs));

tr_debug 相当于 Mbed OS 平台的 printf。是的,我在 Mbed OS 和 Linux 上编译。

最佳答案

对于 size_t,假设您有足够现代的 C 库,请使用 %zu

如果您无法使用 z 修饰符(不幸的是,一些较旧的库不支持它),请在打印时转换为足够宽的已知类型,然后使用适合的宽度说明符该类型:

size_t sz = sizeof(whatever);
...
printf("%lu", (unsigned long)sz);

只要您使用的大小不超过 40 亿左右(即可以容纳 32 位),此方法就有效。如果您使用的系统中 size_t 为 64 位,而 long 为 32 位,则理论上您会遇到 size_t 大小问题可以容纳,但 %lu 无法打印。这对您来说是否是一个问题,以及如果是的话该怎么办,都取决于您。 (如果您的库支持,理想的解决方案是返回 %zu,这是首选解决方案,并且在 32 位、64 位或任何其他位中不会出现此问题大小的环境。或者我猜你可以使用 unsigned long long%llu。)

关于c++ - C printf跨平台格式无警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46569942/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com