C:printf中的ptrdiff_t应该使用哪个字符?

Ami*_*yan 26 c printf pointers

哪些字符应该用于ptrdiff_tprintf

请问C标准明确说明如何打印ptrdiff_tprintf?我还没找到任何人.

int a = 1;
int b = 2;

int* pa = &a;
int* pb = &b;

ptrdiff_t diff = b - a;

printf("diff = %?", diff); // % what?
Run Code Online (Sandbox Code Playgroud)

tro*_*foe 26

是的%td.看到这里.

  • @AmirSaniyan:**No.**`%td`是完全标准的(§7.19.6.1,第7段).由于Microsoft实际上并未提供C编译器,因此VS的行为与标准与否无关. (9认同)
  • `%td`是标准配置.Visual Studio的C编译器不符合当前的C标准. (5认同)
  • @AmirSaniyan:`t`是一个大小说明符,而不是一个类型(这里的类型是'd`).[显然](http://msdn.microsoft.com/en-us/library/tcxf1dw6.aspx)`I`应该用作带有Microsoft实现的`ptrdiff_t`的大小说明符(所以`%Id`),这是非标准的. (3认同)
  • Visual Studio 2015 同时支持“%zu”和“%td”(MSDN 上没有正确记录,但两者测试都正常)。 (2认同)

chu*_*ica 12

C11草案解释了ptrdiff_t7.21.6.1中的长度修改器7" fprintf功能"

t
用于指定后续的d,i,o,u,x,或X转换说明适用于ptrdiff_t或相应的无符号整数类型参数; 或者以下n转换说明符适用于指向ptrdiff_t参数的指针.

使用"%td"如下:信用:@trojanfoe

ptrdiff_t diff = b - a;
printf("diff = %td", diff);
Run Code Online (Sandbox Code Playgroud)

如果编译器不支持"%td",则转换为签名类型 - 越长越好.然后确保替代格式和参数匹配.

// Note the cast
printf("diff = %lld", (long long) diff); // or
printf("diff = %ld", (long) diff);
Run Code Online (Sandbox Code Playgroud)

参考格式说明符


mas*_*oud 5

使用%td,如果您的编译器不支持它,您应该尝试%ld(也将输入转换为long).