可变的可移植使用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):

  • gnu表示%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

    上一篇: t variable portably using the printf family?

    下一篇: What does {0} mean when initializing an object?