对于类型为 long
或指针的参数,可能需要更改 printf(3C)、sprintf(3C)、scanf(3C) 和 sscanf(3C) 的格式字符串。对于要同时在 32 位和 64 位环境中运行的指针参数,格式字符串中给定的转换操作应为 %p。例如,
char *buf; struct dev_info *devi; ... (void) sprintf(buf, "di%x", (void *)devi);
将生成以下警告:
warning: function argument (number) type inconsistent with format sprintf (arg 3) void *: (format) int
使用以下代码将生成不带警告的结果:
char *buf; struct dev_info *devi; ... (void) sprintf(buf, "di%p", (void *)devi);
另外,请检查以确保 buf
指向的存储器大小足以包含 16 个数字。对于类型为 long
的参数,long
类型的长度规范 l 应置于格式字符串中转换操作字符的前面。例如,
size_t nbytes; ulong_t align, addr, raddr, alloc; printf("kalloca:%d%%%d from heap got %x.%x returns %x\n", nbytes, align, (int)raddr, (int)(raddr + alloc), (int)addr);
将生成以下警告:
warning: cast of 64-bit integer to 32-bit integer warning: cast of 64-bit integer to 32-bit integer warning: cast of 64-bit integer to 32-bit integer
以下代码将生成不带警告的结果:
size_t nbytes; ulong_t align, addr, raddr, alloc; printf("kalloca:%lu%%%lu from heap got %lx.%lx returns %lx\n", nbytes, align, raddr, raddr + alloc, addr);