如何使用printf系列便携地打印size_t变量?

我有一个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'

正如预期的那样,警告会消失,若是我将其更改成%lucode

问题是,如何编写代码,以便在32位和64位机器上编译警告? orm

编辑:做为一种解决方法,我想一个答案多是将变量“转换”为一个足够大的整数,好比unsigned long ,并使用%lu打印。 这在两种状况下都有效。 我在寻找是否还有其余想法。 blog


#1楼

在某些平台上,对于某些类型,能够使用特定的printf转换说明符,但有时必须使用转换为更大的类型。 字符串

我在这里记录了这个棘手的问题,例如代码: http//www.pixelbeat.org/programming/gcc/int_types/并按期更新它,并提供有关新平台和类型的信息。 get


#2楼

printf("size = %zu\n", sizeof(thing) );

#3楼

若是你将32位无符号整数传递给%lu格式,它会警告你吗? 它应该没问题,由于转换是明肯定义的,不会丢失任何信息。 编译器

我据说有些平台在<inttypes.h>中定义了你能够插入到格式字符串文字中的宏,但我在Windows C ++编译器上看不到那个标题,这意味着它可能不是跨平台的。 string


#4楼

std::size_t s = 1024;
std::cout << s; // or any other kind of stream like stringstream!

#5楼

看起来它取决于您正在使用的编译器(blech): io

  • gnu说%zu (或%zx ,或%zd但显示它就好像已签名等)
  • 微软表示%Iu (或%Ix ,或%Id但再次签名等) - 但从cl v19开始(在Visual Studio 2015中),Microsoft支持%zu (请参阅此评论的 回复

...固然,若是你使用的是C ++,你能够使用cout代替AraK的建议

相关文章
相关标签/搜索