Fait-il GCC (fenêtres + MinGW) définit-il SCNd8, SCNu8 dans inttypes.h ?
#include <stdio.h>
#include <inttypes.h>
int main(void)
{
int8_t int8;
int16_t int16;
int32_t int32;
int64_t int64;
uint8_t uint8;
uint16_t uint16;
uint32_t uint32;
uint64_t uint64;
scanf("%"SCNd8"%"SCNd16"%"SCNd32"%"SCNd64"%"SCNu8"%"SCNu16"%"SCNu32"%"SCNu64,
&int8, &int16, &int32, &int64, &uint8, &uint16, &uint32, &uint64);
printf("%"PRId8"\n%"PRId16"\n%"PRId32"\n%"PRId64"\n%"PRIu8"\n%"PRIu16"\n%"PRIu32"\n%"PRIu64"\n",
int8, int16, int32, int64, uint8, uint16, uint32, uint64);
return 0;
}
Je ne peux pas compiler ce code utilisant plus en retard GCC + MinGW + Netbeans + Windows. Netbeans dit « incapable de résoudre l'identificateur SCNd8 et SCNu8 ». Je ne peux trouver aucune référence pour SCNd8 et SCNu8 sur le man page de GCC bien que http://linux.die.net/include/inttypes.h les définisse. Je ne reçois pas l'erreur de syntaxe pour l'usage de PRId8 ou de PRIu8.
MinGW inttypes.h (manque de SCNd8 et de SCNu8) (le code d'échantillon)
#define PRIXFAST64 "I64X"
#define PRIXMAX "I64X"
#define PRIXPTR "X"
/*
* fscanf macros for signed int types
* NOTE: if 32-bit int is used for int_fast8_t and int_fast16_t
* (see stdint.h, 7.18.1.3), FAST8 and FAST16 should have
* no length identifiers
*/
#define SCNd16 "hd"
#define SCNd32 "d"
#define SCNd64 "I64d"
#define SCNdLEAST16 "hd"
#define SCNdLEAST32 "d"
#define SCNdLEAST64 "I64d"
#define SCNdFAST16 "hd"
Vous pourriez ajouter le suivant après le #include <inttypes.h> :
#ifndef SCNd8
#define SCNd8 "hhd"
#endif
#ifndef SCNu8
#define SCNu8 "hhu"
#endif
Ce qui devrait être approprié pour la plupart des plates-formes.
Clarification : Là où « la plupart des plates-formes » se rapporte à des plates-formes avec un C99-compliant fscanf/scanf qui peut manipuler le préfixe de hh pour le char, pas simplement le h mettent en tête pour faire court.
Les macros de SCN sont dans la norme C99, ainsi quelque chose va mal. Peut-être vous devriez compiler avec - std=c99.
Intéressant - j'ai MinGW avec la version 4.5.1 de GCC installé.
Les macros de spécificateur de format dans inttypes.h fonctionnent pour la plupart, excepté pour entrer les ints à 8 bits (SCNd8 et SCNu8). L'aer de ces macros défini dans inttypes.h, mais l'essai de les employer ne fonctionne pas tellement bien. Avec le code suivant :
#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;
}
J'obtiens les avertissements suivants :
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
Ainsi il semble que GCC 4.5.1 et/ou glibc ne soutiennent pas les spécificateurs de format de C99 de « %hhd » et de « %hhu ». Si je lance ce programme sous un débogueur, plus que juste les variables d'octet finissent l'modification par les appels de scanf ().
Juste pour la référence, j'emploie la commande suivante de compiler :
"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
Notez que les divers formats de taille d'un caractère d'entrée d'international (cette utilisation « hh ») dans inttypes.h obtiennent seulement compilés dedans si la norme C99 est spécifiée - ils sont protégés par :
#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
Les autres spécificateurs de format sont compilés dedans même pour C90 compile.
Ainsi vous n'obtiendrez pas les formats de « hh » à moins que vous employiez - std=c99 ou - les options std=gnu99 (mais rappelez-vous qu'elles ne semblent pas fonctionner de toute façon).
Mise à jour :
Naturellement ! La raison le « hhd » et des « spécificateurs de hhu ne sont pas soutenues est parce que le temps d'exécution de MinGW emploie le scanf () du msvcrt.dll de Microsoft qui ne connaît rien au sujet de la nouvelle substance dans des formats d'entrée de C99. Si vous voulez employer ces formats d'entrée, vous devrez employer une autre exécution de scanf ().
Comme mentionné dans l'inttypes.h de MinGW :
Le scanf d'exécution de milliseconde semble traiter le « hh » en tant que « h »
Le puits… apparemment la combinaison « la plus en retard GCC + MinGW + Netbeans + Windows » ne fournit pas un compilateur C99 conforme.
La norme documente spécifiquement ces identificateurs comme étant défini dans l'en-tête <inttypes.h>
7,8 La conversion de format du nombre entier dactylographie <inttypes.h>
[...]
7.8.1 [...] [#4] les macros de fscanf pour des nombres entiers signés sont :SCNdN SCNdLEASTN SCNdFASTN SCNdMAX SCNdPTR SCNiN SCNiLEASTN SCNiFASTN SCNiMAX SCNiPTR [#5] Les macros de fscanf pour des entiers sans signe sont : SCNoN SCNoLEASTN SCNoFASTN SCNoMAX SCNoPTR SCNuN SCNuLEASTN SCNuFASTN SCNuMAX SCNuPTR SCNxN SCNxLEASTN SCNxFASTN SCNxMAX SCNxPTR