Tut GCC (Fenster + MinGW) definiert SCNd8, SCNu8 in 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;
}
Ich kann diesen Code nicht unter Verwendung spätesten kompilieren GCC + MinGW + Netbeans + Windows. Netbeans sagt „unfähiges, identifizierendes Merkmal SCNd8 und SCNu8 zu lösen“. Ich kann keinen Hinweis für SCNd8 und SCNu8 auf GCC-Mannseite finden, obgleich http://linux.die.net/include/inttypes.h sie definiert. Ich empfange nicht Syntaxfehler für die Anwendung von PRId8 oder von PRIu8.
MinGW inttypes.h (ermangelt SCNd8 und SCNu8) (Beispielcode)
#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"
Sie konnten das folgende nach #include <inttypes.h> hinzufügen:
#ifndef SCNd8
#define SCNd8 "hhd"
#endif
#ifndef SCNu8
#define SCNu8 "hhu"
#endif
Welches für die meisten Plattformen angebracht sein sollte.
Erklärung: Wo „die meisten Plattformen“ auf Plattformen mit einem C99-compliant fscanf/scanf sich bezieht, das das hh Präfix für Holzkohle behandeln kann, nicht gerade setzen das h kurz vor.
Die SCN-Makro sind im Standard C99, also geht etwas schief. Möglicherweise würden Sie mit - std=c99 kompilieren müssen.
Interessant - ich habe MinGW mit GCC-Version 4.5.1 installiert.
Die Formatspezifikatormakro- in inttypes.h arbeiten in den meisten Fällen, außer für das Eingeben von 8-Bit--ints (SCNd8 und SCNu8). Das jene Makro-aer, das definiert wird, in inttypes.h, aber im Versuchen, sie zu verwenden, arbeitet nicht so gut. Mit dem folgenden Code:
#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;
}
Ich erhalte die folgenden Warnungen:
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
So scheint es, dass GCC 4.5.1 und/oder glibc nicht die „%hhd“ und „%hhu“ C99-Formatspezifikatoren stützen. Wenn ich dieses Programm unter einen Debugger laufen lasse, mehr als gerade beenden die Bytevariablen durch die scanf () Anrufe oben geändert werden.
Gerade als Referenz, verwende ich den folgenden Befehl zu kompilieren:
"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
Merken Sie, dass die verschiedenen Charakter-groß int-Eingabeformate (dieser Gebrauch „hh“) in inttypes.h nur herein kompiliert erhalten, wenn der Standard C99 spezifiziert wird - sie werden vorbei geschützt:
#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
Die anderen Formatspezifikatoren werden herein sogar für C90 kompiliert kompiliert.
So erhalten Sie nicht die „hh“ Formate, es sei denn, dass Sie die - std=c99 oder - Wahlen std=gnu99 verwenden (aber erinnern Sie daran sich, dass sie nicht scheinen, irgendwie zu arbeiten).
Aktualisierung:
Selbstverständlich! Der Grund das „hhd“ und „hhu Spezifikatoren werden nicht ist gestützt, weil die MinGW-Laufzeit das scanf () von Microsofts msvcrt.dll benutzt, das nichts über das neue Material in C99's-Eingabeformaten weiß. Wenn Sie diese Eingabeformate verwenden möchten, müssen Sie irgendeine andere scanf () Durchführung verwenden.
Wie in MinGWs inttypes.h erwähnt:
Mitgliedstaatlaufzeit-scanf scheint, „hh“ als „h“ zu behandeln
Brunnen… anscheinend die späteste Kombination „GCC + MinGW + Netbeans + Windows“ liefert keinen konformen Compiler C99.
Der Standard dokumentiert speziell jene identifizierenden Merkmale, wie, definierend im Titel <inttypes.h>
7,8 Formatumwandlung der ganzer Zahl schreibt <inttypes.h>
[...]
7.8.1 [...] [#4] die fscanf Makro für Ganzzahlen mit Vorzeichen sind:SCNdN SCNdLEASTN SCNdFASTN SCNdMAX SCNdPTR SCNiN SCNiLEASTN SCNiFASTN SCNiMAX SCNiPTR [#5] Die fscanf Makro für nicht unterzeichnete ganze Zahlen sind: SCNoN SCNoLEASTN SCNoFASTN SCNoMAX SCNoPTR SCNuN SCNuLEASTN SCNuFASTN SCNuMAX SCNuPTR SCNxN SCNxLEASTN SCNxFASTN SCNxMAX SCNxPTR