Mingw: printf + unsigned long long



  • hallo,

    also erstmal vorneweg: ich benutze mingw.

    nun hab ich folgenden code:

    #include <stdio.h>
    
    int main()
    {
    	unsigned long long test=123;
    	printf("%llu\n",test);
    	return 0;
    }
    

    nun kompiliere ich das ganze mit:
    gcc -o test.exe test.c -Wall

    das "-Wall" bedeutet, dass der compiler mir ALLE meldungen ausgeben soll, also auch die eher unwichtigeren.

    der code oben erzeugt folgendes:

    test.c: In function 'main':
    test.c:6:2: warning: unknown conversion type character 'l' in format [-Wformat]
    test.c:6:2: warning: too many arguments for format [-Wformat-extra-args]

    die zahl wird übrigens trotzdem ausgegeben.

    meine frage: was wäre die richtige option, wenn ich einen unsigned long long mit printf ausgeben will?


  • Mod

    %llu ist schon richtig, in C99. Compilierst du vielleicht im C89-Modus (das ist der Standard beim GCC)? Die printf-Implementierung wird für beide die gleiche sein (also C99 oder C11 kompatibel - je nach Alter der Implementierung), aber die Compilerwarnungen werden dann für C89 generiert.

    edit: Ich sehe gerade, du hast den Compileraufruf angegeben. Also tatsächlich C89. Gib mal -std=c99 oder -std=c11 als Zusatzoption an.



  • Es ist schon gaaaanz lange her, dass ich mal mit MinGW zu tun hatte. Damals, also noch vor einigen Jahren, war MinGW nicht in der Lage, long long s mit printf auszugeben (kannst ja mal versuchen, eine Zahl auszugeben, die größer als ein einfacher long ist).
    Ein Workaround von damals: %I64d für long long und %l64u für unsigned long long benutzen. Kein Standard, wird aber von MSVCRT.DLL (worauf MinGW aufsetzt) unterstützt. Meines Wissens gibt es aber für long double keinen solchen Workaround.

    Möglicherweise ist das aber alles überflüssig, denn wie gesagt habe ich mit MinGW ewig lange nichts mehr zu tun gehabt und es kann sich seitdem wahnsinnig viel geändert haben.



  • Jaffa schrieb:

    Damals, also noch vor einigen Jahren, war MinGW nicht in der Lage, long long s mit printf auszugeben.

    Das ist kein Problem von MinGW gewesen. Ausnahmsweise gewinnt hierbei mal der Linker, MinGW linkt standardmäßig gegen die msvcrt.dll, das ist richtig, und die hat bis WinXP(?) keinen lld/llu Support für printf. Die msvcrt.dll kommt von Windows, also dem Betriebssystem, nicht vom Compiler. Nur bis VC6 gab es ein wirkliches statischen Linken gegen die vom Compiler selbst bereitgestellte CRT. VC6 Programme ziehen also keine msvcrt.dll explizit an.
    Unter WinXP und früher kann es dir also passieren, dass MinGW im C99-Modus 0 Fehler meldet, das aufgerufene printf aber Müll ausgibt. Sowas ist natürlich sehr ärgerlich.
    Für solche (alten) Laufzeitumgebungen empfiehlt es sich also, mit MinGW explizit gegen eine neuere CRT zu linken, z.B. msvcr100.dll und die dann auch mitzuliefern.

    Jaffa schrieb:

    Meines Wissens gibt es aber für long double keinen solchen Workaround.

    Was hat long double mit long long zu tun? long double ist C89 und wird somit von jedem C89- und aufwärts Compiler unterstützt, inkl. printf usw.


Anmelden zum Antworten