size_t
被定义为无符号整数,但它的大小取决于您使用的是32位或64位计算机。正确且可移植的打印size_t
的方法是什么?
尝试使用%zu
格式化字符串。
size_t val = get_the_value();
printf("%zu",val);
“z”部分是长度说明符,表示该参数的长度将为size_t。
来源-http://en.wikipedia.org/wiki/Printf#printf_format_placeholders
unknown conversion type character 'z' in format [-Wformat]|
,当程序运行时,它只打印zu
作为输出。 - lost_in_the_source这个问题与C++有关,因此 cout <<
是另一个可能的答案。
在所有版本的C语言中,这个问题都难以解决。在C90中,将类型转换为 unsigned long
可能有效,但在C99中可能无效,而C99解决方案在C90中也不一定有效。可靠地区分C90和C99的能力是在1995年的更改中引入的(规定了__STDC__
的允许值)。我认为没有完全可移植的方式适用于C90、C99和C++,尽管在这些语言中的任何一个都有解决方案。
std::size_t n = 1;
std::cout << n;
size_t
值的z
长度修饰符。然而,在TR1之前,这个修饰符是不被支持的,所以你只能将其转换为特定的大小,如下所示:std::size_t n = 1;
std::printf("%lu\n", static_cast<unsigned long>(n));
再次说明,unsigned long long
在C++中并没有得到完全支持,所以以上代码可以正常工作,因为unsigned long
是最大的合法整数类型。在TR1之后,您可以安全地使用%zu
来表示size_t
值。