我有一个类型的变量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'
Run Code Online (Sandbox Code Playgroud)
正如预期的那样,警告会消失,如果我将其更改为%lu.
问题是,如何编写代码,以便在32位和64位机器上编译警告?
编辑:作为一种解决方法,我想一个答案可能是将变量"转换"为一个足够大的整数,比如说unsigned long,并使用打印%lu.这在两种情况下都有效.我在寻找是否还有其他想法.
寻找澄清使用"zd"与printf().
当然,以下对于C99及更高版本是正确的.
void print_size(size_t sz) {
printf("%zu\n", sz);
}
Run Code Online (Sandbox Code Playgroud)
C规范似乎允许printf("%zd\n", sz)取决于它的读取方式:
7.21.6.1 fprintf功能
z用于指定后续的d,i,o,u,x,或X转换说明适用于size_t或相应的符号整型参数; 或者以下n转换说明符适用于指向与size_t参数对应的有符号整数类型的指针.C11dr§7.21.6.17
这应该是作为
z指定以下d...转换说明符适用于size_t或相应的有符号整数类型参数..."(两种类型)和" z指定以下u...转换说明符适用于size_t或相应的有符号整数类型参数. .."(两种类型)要么
z指定以下d...转换说明符适用于相应的有符号整数类型参数..."(仅限带符号类型)和" z指定以下u...转换说明符适用于size_t"(仅限无符号类型).我一直在使用#2定义,但现在不太确定.
哪个是正确的,1,2或其他什么?
如果#2是正确的,那么可以使用
"%zd"哪种类型的示例是什么?