Для школьного проекта я должен закодировать функцию C printf. Все идет хорошо, но есть один вопрос, на который я не могу найти хороший ответ, так что я здесь.
printf("PRINTF(d) \t: %d\n", -2147483648);
говорит мне (gcc -Werror -Wextra -Wall):
error: format specifies type 'int' but the argument has type 'long'
[-Werror,-Wformat]
printf("PRINTF(d) \t: %d\n", -2147483648);
~~ ^~~~~~~~~~~
%ld
Но если я использую переменную int, все идет хорошо:
int i;
i = -2147483648;
printf("%d", i);
Почему?
EDIT:
Я понял много моментов, и они были очень интересными. Во всяком случае, я думаю, printf использует <stdarg.h> librairy, и поэтому va_arg(va_list ap, type) также должен возвращать правильный тип. Для %d и %i, очевидно, возвращаемый тип является int. Что-то меняет?