C++ C printf跨平台格式,无警告

C++ C printf跨平台格式,无警告,c++,c,format,printf,cross-platform,C++,C,Format,Printf,Cross Platform,如何编写代码以在没有警告的情况下跨平台编译。例如,我在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

如何编写代码以在没有警告的情况下跨平台编译。例如,我在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
尺寸可能是最大的违规者:

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操作系统和Linux上编译。

对于
size\u t
,假设您有足够现代化的C库,请使用
%zu

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

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

只要您从未使用过大于40亿左右的大小,即可以容纳32位的大小,此功能就可以正常工作。如果系统中的
size\u t
是64位,而
long
是32位,那么理论上就存在了
size\u t
可以容纳但
%lu
无法打印的大小问题。这对你来说是否是一个问题,如果是,该怎么办,取决于你。(如果您的库支持,理想的解决方案是返回到
%zu
,这是首选解决方案,在32位、64位或任何其他大小的环境中都不会出现此问题。或者,我想您可以使用
无符号长
%llu

通过使用显式大小的整数而不是本机数据类型,可以避免此特定警告

#include <cstdint>

int8_t a = 15; //usually an alias for char
uint16_t b = 4980; //usually an alias for unsigned short
uint32_t c = 1234567890; //usually an alias for unsigned int or unsigned long
int64_t d = 908070605040302010ll; //usually an alias for long long
#包括
int8_t a=15//通常是char的别名
uint16_t b=4980//通常是无符号短字符的别名
uint32_t c=1234567890//通常是无符号int或无符号long的别名
int64_t d=9080706050430201ll//通常是一个很长的别名
大小整数的诀窍在于,例如,如果一个平台上的
long
是32位,而另一个平台上是64位,那么
long
的任何使用都是不可移植的。但是
int64\u t
始终为64位,否则它在给定平台上根本不存在


具体来说,您的代码似乎假定
size\u t
始终为64位,但这并不能保证。因此,您应该改用
uint64\u t
,它保证了无论最终使用何种底层数据类型,它都将是64位的(并且是无符号的,这是与
size\u t
相关联的唯一保证)。

通过为使用的类型使用适当的格式说明符?使用您正在使用的标准类型特别容易。阅读文档以找到每个标准类型的正确格式说明符。发布导致警告的代码及其参数类型。不要使用
*printf()用C++来避免整个问题。你可以使用<代码> STD::CUT并避免这个问题吗?在Windows上,这个转换是缩小的。@ BuMuMuGuang:对吧?增加了讨论。