Когда я выполнил код этого вопроса , я получил это предупреждение:
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
. Этот ответ подтверждает это утверждение.
Теперь из заголовочного файла GCC stddef.h я вижу, что эти типы эквивалентны в этом случае:
typedef __PTRDIFF_TYPE__ ptrdiff_t;
#define __PTRDIFF_TYPE__ long int
Однако я просто собирался предложить неправильное (более или менее) исправление для OP с %ld
вместо %td
.
Могу ли я понять, что одного предупреждения компилятора недостаточно? Или, может быть, разумно истолковал само предупреждение, а не просто отреагировал.