2010-05-28 12 views
7

Ich habe gerade diesen Code auf Wikipedia gefunden.
-Link: http://en.wikipedia.org/wiki/Sizeof#UseIst dies eine korrekte Syntax (c-Code in Wikipedia gefunden)?

Der Code:

/* the following code illustrates the use of sizeof 
* with variables and expressions (no parentheses needed), 
* and with type names (parentheses needed) 
*/ 

char c; 

printf("%zu,%zu", sizeof c, sizeof(int)); 

Darin heißt es: "Der z-Präfix verwendet werden soll, um es zu drucken, da die tatsächliche Größe auf jeder Architektur unterscheiden kann."

ich es auf meinem Compiler versucht, aber es gibt folgendes Ergebnis:

'zu, zu'

Antwort

7

Ja, dass Syntax korrekt ist (zumindest für C99). Sieht so aus, als ob dein Compiler nicht dafür eingerichtet ist. Nehmen Sie einfach die z und Sie werden wahrscheinlich gut. Stellen Sie sicher, dass Ihre Formatspezifizierer printf mit der Größe der Typen übereinstimmen. Das Aktivieren aller Warnungen, die Ihr Compiler Ihnen geben wird, hilft Ihnen wahrscheinlich in dieser Hinsicht.

Ihr Zitat:

Die z-Präfix verwendet werden soll, um es zu drucken, da die tatsächliche Größe

auf jeder Architektur unterscheiden können

sich auf die Tatsache, dass size_t (was der Typ zurückgegeben von der sizeof-Operator) kann von Architektur zu Architektur variieren. Die z soll Ihren Code portabler machen. Wenn dein Compiler das nicht unterstützt, wird das nicht funktionieren. Geige einfach mit Kombinationen von %u, %lu, etc., bis du die Ausgabe sinnvoll findest.

+0

+1 für -Wall ... – jcolebrand

+2

Sie können '% lu' verwenden und den 'sizeof'-Wert explizit in' unsigned long 'umwandeln - solange Sie wissen, dass die Größe des Objekts weniger als 4 GB beträgt, wissen Sie, dass es definitiv korrekt gemeldet wird. – caf

6

Der Längenmodifikator z wurde zu C im C99-Standard hinzugefügt; Möglicherweise haben Sie einen Compiler, der C99 nicht unterstützt.

Wenn Ihre C-Compiler nicht unterstützt, können Sie wahrscheinlich die Größen als unsigned long behandeln:

printf("%lu,%lu", (unsigned long)sizeof c, (unsigned long)sizeof(int)); 
1

Haben Sie Ihren Compiler sagen, dass Sie es mit einem C99 Gehirn denken wollen? Es gibt wahrscheinlich einen Schalter, um das zu tun. Zum Beispiel -std=c99 für gcc.

Wenn Ihr Compiler nicht unterstützt, aber Sie wissen, andere werden, können Sie einen PRId64 Stil Arbeit tun um (Disclaimer - PSEUDO CODE AHEAD ..):

#ifdef __SOME_KNOWN_C99_COMPILER 
#define PORTUNSIGNED "zu" 
#else 
#define PORTUNSIGNED "u" 
#endif 

printf("%-11" PORTUNSIGNED " ways to skin a cat\n"); 

Es ist wahrscheinlich besser, einen Compiler zu erhalten das hat jedoch funktionale Unterstützung für c99.

+2

Der Präprozessor ist nicht böse. –

+2

@George: Das ist keine allgemein gehaltene Meinung. –

+0

@George - Ich sage nicht, dass es böse ist, ich sage nur, dass einige aufhören, es tatsächlich zu benutzen, und damit anfangen, es zu improvisieren, was zu interessanten Dingen führt, die andere Leute irgendwann behalten müssen :) –

2

Ja, aber es funktioniert nur auf C99-kompatible Compiler. Von wikipedia:

z: Bei Integer-Typen bewirkt printf, dass ein Integer-Argument der Größe "Größe_t" erwartet wird.

0

Ich habe einen Test mit gcc 4.0 gemacht. Es funktioniert mit -std=c99

Verwandte Themen