我有一个size_t类型的变量,我想使用printf()打印它。我使用什么格式说明符来可移植地打印它?
在32位机器中,%u似乎是正确的。我用g++ -g -W -Wall -Werror -ansi -pedantic编译,没有警告。但是当我在64位机器上编译该代码时,它会产生警告。
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,警告就会消失。
问题是,我如何编写代码,使它在32位和64位机器上编译警告免费?
编辑:作为一种变通方法,我猜一个答案可能是将变量“强制转换”为一个足够大的整数,比如unsigned long,然后使用%lu打印。这在两种情况下都适用。我看看有没有其他的办法。
扩展亚当·罗森菲尔德对Windows的回答。
我在VS2013 Update 4和VS2015预览版上测试了这段代码:
// test.c
#include <stdio.h>
#include <BaseTsd.h> // see the note below
int main()
{
size_t x = 1;
SSIZE_T y = 2;
printf("%zu\n", x); // prints as unsigned decimal
printf("%zx\n", x); // prints as hex
printf("%zd\n", y); // prints as signed decimal
return 0;
}
VS2015生成二进制输出:
1
1
2
而VS2013生成的则是:
去
zx
zd
注意:ssize_t是POSIX扩展,ssize_t在Windows数据类型中是类似的东西,因此我添加了<BaseTsd.h>引用。
此外,除了以下C99/C11头文件,所有C99头文件都可以在VS2015预览版中使用:
C11 - <stdalign.h>
C11 - <stdatomic.h>
C11 - <stdnoreturn.h>
C99 - <tgmath.h>
C11 - <threads.h>
此外,C11的<uchar.h>现在包含在最新预览中。
有关更多详细信息,请参阅此旧列表和新列表以了解标准一致性。