printf mit sizeof auf 32 vs 64 Plattformen: Wie gehe ich mit Format-Code in plattformunabhängige Art und Weise?

StackOverflow https://stackoverflow.com/questions/1403074

  •  05-07-2019
  •  | 
  •  

Frage

Ich habe einige Code, der die Größe des Speichers durch das Programm verwendet druckt. Die Linie ist ähnlich wie folgt aus:

printf("The about of RAM used is %u", anIntVariable*sizeof(double) );

wobei anIntVariable eine int Variable für die Anzahl der Elemente des Doppel-Array. Wie auch immer, auf 32-Bit-Systemen, die ich noch nie Probleme gehabt, aber auf 64-Bit-Systemen, erhalte ich eine Compiler-Warnung über „% u“ für eine unsigned long integer verwenden. „% Lu“ als Format Code behebt das Problem auf 64-Bit aber bewirkt, dass der Compiler auf 32-Bit zu beschweren, weil die Art zurück zu unsigned int ist. Ich habe, dass in der Tat gefunden, sizeof (double) einen anderen Wert auf 32 vs 64-Bit-Systeme zurück. Ich habe auf einige Webseiten Führer gefunden konvertieren Code von 32 Bit auf 64 Bit Aber ich würde lieber Code hat, der nur das Umwandeln zurück auf beiden statt arbeitet und her.

Wie schreibe ich diese Zeile in einer plattformunabhängigen Art und Weise? Ich weiß, viele Möglichkeiten, was ich tun konnte es Präprozessordirektiven verwenden, aber das scheint wie ein Hack. Sicherlich gibt es eine elegante Art und Weise, die ich nicht zu realisieren.

War es hilfreich?

Lösung

Tragbare printf Identifikatoren sind in der Include-Datei zur Verfügung gestellt inttypes.h .

Diese Include-Datei viele tragbare Identifikatoren für Ihre spezifische Laufzeit hat. Für Ihr Beispiel möchten Sie PRIuPTR, die " PR intf I dentifier u nsigned mit einer Größe von bis zu einer Größe des Zeigers" bedeutet.

Ihr Beispiel ist dann:

printf("The amount of RAM used is %" PRIuPTR, anIntVariable*sizeof(double) );

Ergebnisse auf 64-Bit-Linux mit GCC 4.3 (int anIntVariable = 1):

$ gcc test.c -m32 -o test && ./test
The amount of RAM used is 8
$ gcc test.c -o test && ./test
The amount of RAM used is 8

Der Vollständigkeit halber gibt es Identifikatoren für scanf auch deren Präfixe sind SCN.

Andere Tipps

Der Rückgabewert von sizeof ist ein size_t. Wenn Sie einen C99-konformen Compiler verwenden sieht es aus wie Sie %zd %zu dafür verwenden können.

D'oh: %zu (unsigned) natürlich. Danke, ony.

Zunächst einmal sollten Sie den „%“ Spezifizierer übereinstimmen mit den tatsächlichen Daten geben Sie drucken möchten. sizeof gibt den Datentyp size_t , und wie Sie nicht versuchen sollten, einen Schwimmer mit einem „% d“ Spezifizierer zu drucken, sollten Sie nicht versuchen, ein size_t zu drucken mit "% u" oder "% d" oder etwas, das nicht wirklich bedeutet size_t.

Die anderen Antworten haben einige gute Möglichkeiten gegeben dies ( „% z“ und PRIu32) mit neueren Compilern zu handhaben, aber die Art und Weise haben wir dies einfach zu tun, war die size_t zu unsigned long zu werfen, und drucken Sie es dann mit " % lu ":

printf("The amount of RAM used is %lu", (unsigned long)(anIntVariable*sizeof(double)) );

Dies wird nicht auf Systemen arbeiten, wo size_t breiter als ein lang ist, aber ich weiß nicht von irgendwelchen solcher Systeme, und ich bin nicht einmal sicher, ob der Standard erlaubt es.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top