gsa*_*ras 6 c types pointers compiler-warnings pointer-arithmetic
当我执行这个问题的代码时,我得到了这个警告:
warning: format '%d' expects argument of type 'int', but argument 2 has type 'long int' [-Wformat=]
printf("P-Q: %d, P: %d, Q: %d", (p - q), p, q);
~^ ~~~~~~~
%ld
Run Code Online (Sandbox Code Playgroud)
作为反射修复,我曾经%ld打印过两个指针的减法.编制者同意了.
幸运的是,我看到其他用户提到%td应该使用的评论,因为减法的结果类型是ptrdiff_t.这个答案证实了这一说法.
现在从GCC的stddef.h头文件中,我可以看到这些类型在这种情况下是等价的:
typedef __PTRDIFF_TYPE__ ptrdiff_t;
#define __PTRDIFF_TYPE__ long int
Run Code Online (Sandbox Code Playgroud)
但是,我只是建议对OP进行错误的(或多或少)修复%ld,而不是%td.
有没有一种方法我可以理解单独的编译器警告是不够的?或者也许明智地解释警告本身,而不仅仅是反应.
小智 2
我想你看不出来。这取决于编译器编写者的意图/谨慎/聪明程度。
也许他决定永远支持预期的%ld地方%td,或者也许他只是不知道/无法/不愿意给出更详细/正确的信息。如有疑问,您最后的选择就是标准。
这似乎不是一个可移植的构造,对于“正统”,您应该支持两种格式说明符。