【发布时间】:2018-12-06 01:24:59
【问题描述】:
当我执行这个question的代码时,我得到了这个警告:
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
作为反射修复,我使用%ld 打印两个指针的减法。编译器同意了。
幸运的是,我看到另一个用户的评论提到应该使用%td,因为减法的结果类型是ptrdiff_t。这个answer 证实了这一说法。
现在从 GCC 的 stddef.h 头文件中,我可以看到在这种情况下这些类型是等价的:
typedef __PTRDIFF_TYPE__ ptrdiff_t;
#define __PTRDIFF_TYPE__ long int
但是,我只是建议对 OP 进行错误(或多或少)修复,使用 %ld,而不是 %td。
有没有办法让我理解仅仅编译器警告是不够的?或者也许明智地解释了警告本身,而不仅仅是做出反应。
【问题讨论】:
-
似乎是 QoI 问题。编译器应该能够检测到它被减去的两个指针,并打印
ptrdiff_t而不是它的别名。 -
g++(如果用它编译也有意义的话)和 gcc 都提供了相同的警告@StoryTeller,如果有帮助的话。
-
生活和学习。我还没有看到提及
%ju或%zu或%tu的编译器警告。警告总是提到实现使用的基本类型。所以你只需要知道... -
Clang 也建议
%ld... -
user3386109 体验确定。智慧与经验同行..很高兴知道@Bob__,谢谢!
标签: c pointers types compiler-warnings pointer-arithmetic