Интересно - у меня MinGW с установленной GCC версии 4.5.1.
Макросы спецификатора формата в inttypes.h
работают по большей части, за исключением тех, которые для ввода 8-битных целых (* 1004)* и SCNu8
).Эти макросы определены в inttypes.h
, но попытка использовать их не очень хорошо работает.Со следующим кодом:
#include <stdio.h>
#include <inttypes.h>
int main(void)
{
int8_t int8 = 0;
uint8_t uint8 = 0;
scanf("%"SCNd8, &int8);
scanf("%"SCNu8, &uint8);
return 0;
}
я получаю следующие предупреждения:
C:\temp\test.c: In function 'main':
C:\temp\test.c:9:5: warning: unknown conversion type character 'h' in format
C:\temp\test.c:9:5: warning: too many arguments for format
C:\temp\test.c:10:5: warning: unknown conversion type character 'h' in format
C:\temp\test.c:10:5: warning: too many arguments for format
Так что похоже, что GCC 4.5.1 и / или glibc не поддерживают "% hhd"и "% hhu" спецификаторы формата C99.Если я запускаю эту программу в отладчике, меняются не только байтовые переменные do при вызовах scanf()
.
Просто для справки, я использую следующую командудля компиляции:
"C:\MinGW\bin\gcc" -std=c99 -Wall -g -Ic:\MinGW\include -D_WIN32_WINNT=0x0500 "C:\temp\test.c" -lkernel32 -luser32 -lgdi32 -ladvapi32 -lshlwapi -loleaut32 -o "test".exe
Обратите внимание, что различные форматы ввода int размером с символ (в которых используется "hh") в inttypes.h
компилируются, только если указан стандарт C99 - они защищены:
#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
Другие спецификаторы формата скомпилированы даже для компиляций C90.
Таким образом, вы не получите форматы "hh", если не будете использовать опции -std=c99
или -std=gnu99
(но помните, что они все равно не работают).
Обновление:
Конечно!Причина, по которой спецификаторы "hhd" и "hhu" не поддерживаются, заключается в том, что среда выполнения MinGW использует scanf()
из msvcrt.dll
от Microsoft, который ничего не знает о новом материале во входных форматах C99. Если вы хотите использоватьэти входные форматы, вам нужно будет использовать некоторые другие реализации scanf()
.
Как уже упоминалось в inttypes.h
MinGW:
MSf runf scanf, по-видимому, обрабатывает "чч" как"ч"