可变的可移植使用printf家族?
我有一个size_t
类型的变量,我想用printf()
来打印它。 我使用哪种格式说明符来轻松打印?
在32位机器中, %u
似乎是正确的。 我编译了g ++ -g -W -Wall -Werror -ansi -pedantic,并没有任何警告。 但是当我在64位机器中编译该代码时,它会产生警告。
size_t x = <something>;
printf( "size = %un", x );
warning: format '%u' expects type 'unsigned int',
but argument 2 has type 'long unsigned int'
如预期的那样,如果我将其改为%lu
,则警告消失。
问题是,我如何编写代码,以便在32位和64位机器上编译免费的警告?
编辑:我想一个答案可能是将变量“转换”为unsigned long
,并使用%lu
打印。 这在两种情况下都会起作用。 我在寻找是否有其他想法。
使用z
修饰符:
size_t x = ...;
ssize_t y = ...;
printf("%zun", x); // prints as unsigned decimal
printf("%zxn", x); // prints as hex
printf("%zdn", y); // prints as signed decimal
看起来它取决于你使用的编译器(blech):
%zu
(或者%zx
或者%zd
但是显示它就好像它已经被签名一样,等等) %Iu
(或%Ix
,或%Id
但又是签名等) - 但是从cl v19开始(在Visual Studio 2015中),Microsoft支持%zu
(请参阅此评论的回复) ......当然,如果您使用的是C ++,您可以按照AraK的建议使用cout
。
对于C89,使用%lu
并将值转换为unsigned long
:
size_t foo;
...
printf("foo = %lun", (unsigned long) foo);
对于C99及更高版本,请使用%zu
:
size_t foo;
...
printf("foo = %zun", foo);
链接地址: http://www.djcxy.com/p/12525.html