sscanf(3)
говорит (выделено мое):
i
Соответствует целому числу со знаком; следующий указатель должен быть указателем на int
. Целое число читается в основании 16, если оно начинается с 0x
или 0X
, в основании 8, если оно начинается с 0
, и в основании 10 в противном случае. Используются только символы, соответствующие основанию.
Однако G CC не жалуется на использование unsigned int
с %i
, если не указано -pedantic
. Это отличается от поведения, к которому я привык, когда G CC будет предупреждать о любой несовпадающей строке типа и формата.
Почему эта комбинация ведет себя по-разному?
Учитывая, что это предупреждение не входит в общий набор -Wall
предупреждений, допустимо ли передавать unsigned int
в %i
?
Пример программы:
#include <stdio.h>
int main(void)
{
int i;
unsigned int u;
float f;
scanf("%i", &i);
scanf("%i", &u);
scanf("%i", &f);
return 0;
}
Без -pedantic
, G CC жалуется на %i
и float *
, но не unsigned int *
:
$ gcc -Wall -Wextra scanf_i.c
scanf_i.c: In function ‘main’:
scanf_i.c:11:13: warning: format ‘%i’ expects argument of type ‘int *’, but argument 2 has type ‘float *’ [-Wformat=]
scanf("%i", &f);
~^ ~~
%e
С -pedantic
, G CC жалуется на оба: Выход с -pedantic
:
$ gcc -Wall -Wextra -pedantic scanf_i.c
scanf_i.c: In function ‘main’:
scanf_i.c:10:13: warning: format ‘%i’ expects argument of type ‘int *’, but argument 2 has type ‘unsigned int *’ [-Wformat=]
scanf("%i", &u);
~^ ~~
%i
scanf_i.c:11:13: warning: format ‘%i’ expects argument of type ‘int *’, but argument 2 has type ‘float *’ [-Wformat=]
scanf("%i", &f);
~^ ~~
%e
G CC версия:
$ gcc --version
gcc (Debian 8.3.0-6) 8.3.0