我知道在SO上已经多次受到质疑,但我的问题是ANSI C(C89)特有的.
在C99有子符z和t,其未在ANSI下支持
使用说明p符怎么样?
size_t是实现定义的无符号整数类型. ptrdiff_t是一个实现定义的有符号整数类型.
在C89/C90中(通常,但严格来说,错误地称为"ANSI C"),这些类型没有特殊的格式说明符.但最宽的整数类型long int和unsigned long int,这当然也有自己的格式说明.
要打印size_t值,请将其强制转换为unsigned long使用"%lu".
要打印ptrdiff_t值,请将其强制转换为long使用"%ld".
请注意,如果您的代码随后使用C99或C11编译器进行编译,则可能size_t和/或ptrdiff_t可能更宽long,并且代码可能会失败.(我记得64位Windows界面有32位long,所以这在实践中可能是一个问题.)
在C99及更高版本中,只需使用%zufor size_t和%tdfor ptrdiff_t.如果您希望您的代码真正可移植,请考虑使用#if以测试其值__STDC_VERSION__.
如果您的编译器仅部分符合C99或C11 ,您也可能遇到问题.您可能有一个不完全支持C99的编译器,但确实提供了long long.但是为了打印一个size_t值,如果您打印的值实际超过ULONG_MAX,那么这只会是一个问题,至少是2 32 -1.对于一个ptrdiff_t值,long只要它不超过,转换为就可以了LONG_MAX,这至少是2 31 -1.
最后,如果您碰巧知道您打印的值不是太大,那么您可以放弃int使用%d.我建议转换为unsigned long或long,但是int对于快速和脏代码是可以的.
使用说明
p符怎么样?
不,%p仅适用于类型的指针void*,并且在任何情况下输出格式都是实现定义的(它通常是十六进制,但我已经看过其他表示).