什么是使用printf来打印size_t的正确方法?

Size_t被定义为一个unsigned整数,但是它的大小取决于你是在32位还是在64位机器上。 什么是正确和便携的方式来打印size_t

尝试使用%zu格式的string

 size_t val = get_the_value(); printf("%zu",val); 

z部分是一个长度说明符,说明参数长度是size_t。

来源 – http://en.wikipedia.org/wiki/Printf#printf_format_placeholders

这里有一个C ++标签,所以cout <<是另一个可能的答案。

这在C的所有版本中都很难实现。在C90中,转换为unsigned long应该可行,但在C99中可能不适用,而C99解决scheme不一定适用于C90。 在1995年的变化(指定__STDC__的允许值)中引入了可靠地区分C90和C99的能力。 我不认为有一个完全可移植的方式适用于C90,C99和C ++,尽pipe这些解决scheme可以解决这些问题。

我认为,C ++的答案是:

 std::size_t n = 1; std::cout << n; 

对于C风格的IO来说,这有点复杂。 在C99中,他们为size_t值添加了z长度修饰符。 但是,在TR1之前,这是不被支持的,所以你只剩下铸造到一个特定的大小,如:

 std::size_t n = 1; std::printf("%lu\n", static_cast<unsigned long>(n)); 

然后再一次, unsigned long long并不真正被C ++支持,所以上面的方法可以正常工作,因为unsigned long是最大的合法整数types。 在TR1之后,您可以安全地使用%zu作为size_t值。