我有以下内容
size_t   i = 0;
uint32_t k = 0;
printf("i [ %lu ] k [ %u ]\n", i, k);
编译时我收到以下警告:
format ‘%lu’ expects type ‘long unsigned int’, but argument has type ‘uint32_t’
当我使用夹板运行时,我得到以下内容:
Format argument 1 to printf (%u) expects unsigned int gets size_t: k
非常感谢任何建议,
有PRIu128,其行为类似于PRIu64来自<inttypes.h>:
printf("%" PRIu64 "\n", some_uint64_value);
或者手动逐位转换:
int print_uint128(uint128_t n) {
  if (n == 0)  return printf("0\n");
  char str[40] = {0}; // log10(1 << 128) + '\0'
  char *s = str + sizeof(str) - 1; // start at the end
  while (n != 0) {
    if (s == str) return -1; // never happens
    *--s = "0123456789"[n % 10]; // save last digit
    n /= 10;                     // drop it
  }
  return printf("%s\n", s);
}
是唯一的选择吗? …
我目前正在使用显式强制转换unsigned long long并使用%llu它来打印它,但既然size_t有说明%z符,为什么没有clock_t?
甚至没有宏观.也许我可以假设在x64系统(操作系统和CPU)size_t上长度为8个字节(即使在这种情况下,他们已提供%z),但是呢clock_t?
我有一些代码打印程序使用的内存量.该行类似于:
printf("The about of RAM used is %u", anIntVariable*sizeof(double) );
其中anIntVariable是double数组元素数的int变量.无论如何,在32位系统上我从来没有遇到任何问题,但在64位系统上,我得到一个编译器警告关于使用"%u"作为无符号长整数.使用"%lu"作为格式代码可以解决64位问题,但会导致编译器抱怨32位,因为类型返回unsigned int.我发现,确实,sizeof(double)在32位与64位系统上返回不同的值.我找到了一些网页指南,用于将代码从32位转换为64位但是我宁愿让代码同时适用于两者而不仅仅是来回转换.
如何以独立于平台的方式编写此行?我知道很多方法可以使用预处理器指令来实现它,但这似乎是一个黑客攻击.当然有一种我没有意识到的优雅方式.
我经常会遇到我想要printf使用整数类型的实现定义大小(如ino_t或time_t)的值进行打印的情况.现在,我使用这样的模式:
#include <inttypes.h>
ino_t ino; /* variable of unknown size */
printf("%" PRIuMAX, (uintmax_t)ino);
这种方法到目前为止有效,但它有一些缺点:
有更好的策略吗?
可能重复:
我应该如何打印off_t和size_t等类型?
我正在使用fstat(stream, &fs)C中的文件大小返回类型off_t.
打印这个只是一个警告:
format ‘%d’ expects type ‘int’, but argument has type ‘off_t’
任何想法如何打印这没有编译器错误?
我知道在SO上已经多次受到质疑,但我的问题是ANSI C(C89)特有的.
在C99有子符z和t,其未在ANSI下支持
使用说明p符怎么样?
我typedef在 C 中尝试使用'd 变量时遇到的问题之一是弄清楚实际的原始类型是什么,typedef以便%在尝试使用printf. 大多数时候我不得不参考gcc. 例如,使用时,stat系统调用,返回的结构有很多不同成员的typedef“d类型的喜欢dev_t,ino_t,mode_t,等,我通常去猜测什么样的格式说明可能是然后编译器警告我,我更正:
stat_demo.c: In function ‘main’:
stat_demo.c:46:45: warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘__blksize_t’ {aka ‘long int’} [-Wformat=]
   46 |     printf("block size for file system IO: %d\n", s->st_blksize);
      |                                            ~^     ~~~~~~~~~~~~~
      |                                             |      |
      |                                             int    __blksize_t {aka long int}
      |                                            %ld
这是大多数人在打印 typedef 时使用它们的方式吗?这难道不是因为你需要知道真正的原始生命typedef是什么吗?有没有更好的方法来完全抽象实际类型?