相关疑难解决方法(0)

如何使用printf系列便携地打印size_t变量?

我有一个类型的变量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.这在两种情况下都有效.我在寻找是否还有其他想法.

c printf

373
推荐指数
8
解决办法
27万
查看次数

如何在`printf()`中使用"zd"说明符?

寻找澄清使用"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

这应该是作为

  1. " z指定以下d...转换说明符适用于size_t或相应的有符号整数类型参数..."(两种类型)和" z指定以下u...转换说明符适用于size_t或相应的有符号整数类型参数. .."(两种类型)

要么

  1. " z指定以下d...转换说明符适用于相应的有符号整数类型参数..."(仅限带符号类型)和" z指定以下u...转换说明符适用于size_t"(仅限无符号类型).

我一直在使用#2定义,但现在不太确定.

哪个是正确的,1,2或其他什么?

如果#2是正确的,那么可以使用"%zd"哪种类型的示例是什么?

c printf

14
推荐指数
1
解决办法
2万
查看次数

标签 统计

c ×2

printf ×2