我有一个size_t
类型的变量,我想用printf()
打印它。 我使用什么格式说明符来便携地打印它? visual-studio
在32位机器中, %u
彷佛是正确的。 我用g++ -g -W -Wall -Werror -ansi -pedantic
,没有任何警告。 可是当我在64位机器中编译该代码时,它会产生警告。 spa
size_t x = <something>; printf( "size = %u\n", x ); warning: format '%u' expects type 'unsigned int', but argument 2 has type 'long unsigned int'
正如预期的那样,警告会消失,若是我将其更改成%lu
。 code
问题是,如何编写代码,以便在32位和64位机器上编译警告? orm
编辑:做为一种解决方法,我想一个答案多是将变量“转换”为一个足够大的整数,好比unsigned long
,并使用%lu
打印。 这在两种状况下都有效。 我在寻找是否还有其余想法。 blog
在某些平台上,对于某些类型,能够使用特定的printf转换说明符,但有时必须使用转换为更大的类型。 字符串
我在这里记录了这个棘手的问题,例如代码: http : //www.pixelbeat.org/programming/gcc/int_types/并按期更新它,并提供有关新平台和类型的信息。 get
printf("size = %zu\n", sizeof(thing) );
若是你将32位无符号整数传递给%lu格式,它会警告你吗? 它应该没问题,由于转换是明肯定义的,不会丢失任何信息。 编译器
我据说有些平台在<inttypes.h>
中定义了你能够插入到格式字符串文字中的宏,但我在Windows C ++编译器上看不到那个标题,这意味着它可能不是跨平台的。 string
std::size_t s = 1024; std::cout << s; // or any other kind of stream like stringstream!
看起来它取决于您正在使用的编译器(blech): io
%zu
(或%zx
,或%zd
但显示它就好像已签名等) %Iu
(或%Ix
,或%Id
但再次签名等) - 但从cl v19开始(在Visual Studio 2015中),Microsoft支持%zu
(请参阅此评论的 回复 ) ...固然,若是你使用的是C ++,你能够使用cout
代替AraK的建议 。