59

C cinsinden size_t türünde bir değişken yazdırmak istiyorum, ancak farklı mimarilerde farklı değişken türlerine size_t eklenmiş gibi görünüyor. Örneğin, bir makinede (64-bit) Aşağıdaki kod herhangi bir uyarı atmak değildir:Platform bağımsız size_t Format belirleyicileri c?

:
size_t size = 1; 
printf("the size is %ld", size); 

ama benim diğer makinede (32-bit) Yukarıdaki kod aşağıdaki uyarı mesajı üretir

uyarı: biçimi '% ld', 'uzun int *' ama argüman 3 tip vardır 'size_t *' Bu işaretçi boyutundaki farktan kaynaklanmaktadır şüpheli

yazın beklediğini üzerinde böylece benim 64 bit makine size_t, bir long int ("%ld") için takma addır, ancak 32 bit makinemde size_t başka bir türe sahip.

size_t için özel bir biçim belirteci var mı?

+0

Uyarı mesajınız kodla eşleşmiyor. Uyarı, işaretçilerden söz eder, kodunuzda hiç yoktur. Bazılarını '&' kaldırdınız mı? – Jens

+0

İşaretçiler? Hayır, işaretçiler hakkında herhangi bir uyarı almıyorum, aslında bu kodu hangi makinede çalıştırdığına bağlı olarak bazen uyarı alamıyorum. Aşağıdaki sınama kodunu deneyin: #include int main() { size_t size = 1; printf ("boyut% ld", boyut); geri dönüş 0; } –

+1

Ayrıca bkz. [Cross_t türünde değişkenler için çapraz platform biçimi dizesi] (http://stackoverflow.com/questions/174612/cross-platform-format-string-for-variables-of-type-size-t) . – legoscia

cevap

87

: Evet z uzunluğu katsayısının düzeltilmesi kullanın:

size_t size = sizeof(char); 
printf("the size is %zd\n", size); // decimal size_t 
printf("the size is %zx\n", size); // hex size_t 

kullanılabilen diğer uzunluk modifiye

( char için) hh olan h ( short için), l ( long için), ( long long için) ll j ( intmax_t için), t ( ptrdiff_t için) ve L ( long double için). C99 standardının §7.19.6.1 (7) 'e bakınız.

+0

zd ve zu arasındaki fark nedir? Zd'nin ondalık olduğunu anlıyorum, ama eğer imzalanmışsa, eğer zd imzalı şeyleri nasıl imzalıyor? –

+1

Bir 'size_t' ile bir' ssize_t' arasındaki fark var; ikincisi nadiren kullanılır. –

+20

Doğru, bu durumda, argüman imzasız olduğundan, '% zu' kullanıyor olmalısınız. – caf

25

Evet, var. %zu (ANSI C99'da belirtildiği gibi). Yanlış uzunluğu katsayısının düzeltilmesi, ve yanlış format dönüştürme belirteci: Bu şekilde %ldsize_t işaretsiz olan Not bu

size_t size = 1; 
printf("the size is %zu", size); 

, çift yanlıştır. Merak ediyorsanız, %zd ssize_t içindir (imzalı).

0

MSDN, Visual Studio'nun 32 ve 64 bit platformlarda taşınabilir kod için "I" önekini desteklediğini belirtir.

size_t size = 10; 
printf("size is %Iu", size); 
+3

, standartlara uygun olmayan MS'e özgüdür, bu yüzden platformdan bağımsız değildir –