2

我在 C 中编译时收到以下警告。

   ../tcpuip/uip_arp.c: In function 'display_arp_table':
    ../tcpuip/uip_arp.c:547: warning: '0' flag ignored with precision and '%x' gnu_p
    rintf format
    ../tcpuip/uip_arp.c:547: warning: '0' flag ignored with precision and '%x' gnu_p
    rintf format
    ../tcpuip/uip_arp.c:547: warning: '0' flag ignored with precision and '%x' gnu_p
    rintf format
    ../tcpuip/uip_arp.c:547: warning: '0' flag ignored with precision and '%x' gnu_p
    rintf format
    ../tcpuip/uip_arp.c:547: warning: '0' flag ignored with precision and '%x' gnu_p
    rintf format
    ../tcpuip/uip_arp.c:547: warning: '0' flag ignored with precision and '%x' gnu_p
    rintf format
    ../tcpuip/uip_arp.c:547: warning: '0' flag ignored with precision and '%x' gnu_p
    rintf format
    ../tcpuip/uip_arp.c:547: warning: '0' flag ignored with precision and '%x' gnu_p
    rintf format
    ../tcpuip/uip_arp.c:547: warning: '0' flag ignored with precision and '%x' gnu_p
    rintf format
    ../tcpuip/uip_arp.c:547: warning: '0' flag ignored with precision and '%x' gnu_p
    rintf format
    ../tcpuip/uip_arp.c:547: warning: '0' flag ignored with precision and '%x' gnu_p
    rintf format
    ../tcpuip/uip_arp.c:547: warning: '0' flag ignored with precision and '%x' gnu_printf format

错误所在的行是

        RELEASE_MSG("MAC: %0.2x.%0.2x.%0.2x.%0.2x.%0.2x.%0.2x  ",(unsigned char)tabptr->ethaddr.addr[0],(unsigned char)tabptr->ethaddr.addr[1],(unsigned char)tabptr->ethaddr.addr[2],(unsigned char)tabptr->ethaddr.addr[3],(unsigned char)tabptr->ethaddr.addr[4],(unsigned char)tabptr->ethaddr.addr[5]);

tabptr 是 struct arp_entry 的指针

PACKED struct arp_entry {
  u16_t ipaddr[2];
  struct uip_eth_addr ethaddr;
  u8_t time;
#ifdef _ALIGNED_
  u8_t dummy;
#endif
}

ethadder 是 struct uip_eth_addr 的指针

PACKED struct uip_eth_addr {
  u8_t addr[6];
}  ;

请如果有人可以分享一些关于这个警告的信息。我只知道 %0.2x 表示字符为两位数十六进制。帮助!

4

3 回答 3

6

格式字符串的%0.2x意思是:

  • 以十六进制打印一个无符号整数
  • 打印至少两个数字
  • 从左边用零填充

由于精度定义了输出的最小位数,零填充将被忽略(来自规范)。你可以使用,%.2x否则%02x会做你想做的事。

要得到

   1
  11
55555

你会用%4x.

  01
  11
 111

将会%4.2x

0001
0011
55555

将是%04x%.4x

请注意,值签名时存在差异。精度定义了位数,这意味着该值将多占用一个符号空间。使用最小输出宽度,符号已经被计算在内:

$ printf "%.5i\n%05i\n" '-11' -11
-00011
-0011
于 2012-04-09T10:38:52.337 回答
3

你当然想写:

%02x代替%0.2x

于 2012-04-09T10:35:38.627 回答
2

实际上,%2.2x将是 2 位十六进制。 0是一个格式标志,表示零填充而不是空白填充,但是由于您没有指定字段宽度,只有精度,所以没有意义。

于 2012-04-09T10:34:25.047 回答