MinGW-GCC: "Unbekanntes Konvertierungstyp-Zeichen 'h'" (snprintf)

Okay, ich habe ein seltsames Problem kompilieren eine C-Datei mit MinGW (GCC 4.6.2) auf Windows 7. Die fragliche Datei enthält die folgenden C-code:

#include <stdio.h>

int main(int argc, char *argv[]) {
    printf("%2hhX\n", 250);
    char c[80];
    snprintf(c, sizeof(c), "%2hhX", 250);
    printf("%s\n", c);
    return 0;
}

Die Zusammenstellung zeigt sich, wie diese:

$ gcc.exe -std=c99 -pedantic -Wall test.c
test.c: In function 'main':
test.c:6:2: warning: unknown conversion type character 'h' in format [-Wformat]
test.c:6:2: warning: too many arguments for format [-Wformat-extra-args]

Nun, was bei mir seltsam ist, dass es Beschwerden über die snprintf - Aufruf in Zeile 6, aber nicht die printf Anruf auf der Linie 4. Bin ich etwas fehlt, oder warn das nur falsch? Auch, gibt es vielleicht eine bessere Entsprechung für den format-string "%2hhX"? (Ich bin versucht zu drucken char-Variablen als hexadezimal-Werte.)

  • Interessanterweise funktioniert es mit GCC 4.3.4: ideone.com/LAPP9. Ich habe auch versucht mit 4.1.2, und es ist in Ordnung auf diese zu.
  • Mit MinGW-GCC-4.6.1 bekomme ich Warnungen auf beiden printf() und die snprintf() - was MinGW-Distribution verwenden Sie? Ich bin derzeit mit der TDM-Verteilung.
  • Uh, ich war gar nicht bewusst, dass es mehrere MinGW-Distributionen. Ich bin mit dem "standard" ein, ich denke (mingw.org, installiert mit sourceforge.net/projects/mingw/files/Installer/mingw-get-inst). Würde das einen Unterschied machen, obwohl?
  • Außerdem bin ich noch mehr verwirrt, jetzt haben wir 3 verschiedene Verhaltensweisen auf 4 Versionen von GCC. Der format-string ist gültig, obwohl, ist es nicht?
  • Ich verwende in der Regel TDM ist MinGW (tdm-gcc.tdragon.net) und/oder nuwen s (nuwen.net/mingw.html). Ich habe festgestellt, dass Sie viel einfacher zu installieren als die offizielle MinGW (nuwen ist buchstäblich Auspacken eines Archivs), Sie-Paket weitere nützliche Bibliotheken (z.B. pthreads-win32-in TDM-und Boost in nuwen) und TDM hat eine option für ein 64-bit-targeting-compiler.
  • alles was ich sicher weiß ist, dass 4.6.1 ist snprintf() scheint nicht zu behandeln "%2hhX" wie ich erwarte - es ignoriert die zusätzlichen h also, wenn Sie eine negative Zahl oder ein unsigned mit einem größeren Wert als 255 bekommen Sie mehr als zwei Zeichen ausgedruckt. Ich denke, dass technisch das ist Undefiniertes Verhalten, aber immer noch, wenn Sie erwarten sind nur die niederwertigsten byte gedruckt werden, einige weitere test könnte in Ordnung sein. 4.7.0 funktioniert wie erwartet, habe ich nicht einen 4.6.2 testen.
  • Für mich funktioniert es so wie erwartet (4.6.2); unabhängig davon, ob ich den pass in negative oder große Werte, erhalte ich nur zwei Zeichen, der/das am wenigsten signifikante byte.

InformationsquelleAutor Socob | 2012-05-20
Schreibe einen Kommentar