Saya ingin mencetak variabel bertipe size_t
C tetapi tampaknya size_t
variabel tersebut memiliki alias berbeda pada arsitektur yang berbeda. Misalnya, pada satu mesin (64-bit), kode berikut tidak menampilkan peringatan apa pun:
size_t size = 1;
printf("the size is %ld", size);
tetapi di komputer saya yang lain (32-bit), kode di atas menghasilkan pesan peringatan berikut:
peringatan: format '% ld' mengharapkan tipe 'long int *', tetapi argumen 3 memiliki tipe 'size_t *'
Saya menduga hal ini disebabkan oleh perbedaan ukuran penunjuk, sehingga pada mesin 64-bit saya di- size_t
alias dengan a long int
( "%ld"
), sedangkan pada mesin 32-bit saya di- size_t
alias ke tipe lain.
Apakah ada penentu format khusus untuk size_t
?
c
platform-independent
size-t
format-string
format-specifiers
Ethan Heilman
sumber
sumber
&
suatu tempat?warning: format '%ld' expects type 'long int *', but argument 3 has type 'size_t *'
kapan seharusnya dikatakanwarning: format '%ld' expects type 'long int', but argument 3 has type 'size_t'
. Apakah Anda mungkin menggunakanscanf()
sebagai gantinya saat mendapat peringatan ini?Jawaban:
Ya: gunakan
z
pengubah panjang:size_t size = sizeof(char); printf("the size is %zu\n", size); // decimal size_t ("u" for unsigned) printf("the size is %zx\n", size); // hex size_t
Pengubah panjang lain yang tersedia adalah
hh
(untukchar
),h
(untukshort
),l
(untuklong
),ll
(untuklong long
),j
(untukintmax_t
),t
(untukptrdiff_t
), danL
(untuklong double
). Lihat §7.19.6.1 (7) dari standar C99.sumber
size_t
dan anssize_t
; yang terakhir ini jarang digunakan.%zu
, karena argumennya tidak ditandatangani.z
pengubah panjang bukan bagian dari C89 / C90. Jika Anda membidik kode yang sesuai dengan C89, hal terbaik yang dapat Anda lakukan adalah mentransmisikan keunsigned long
dan menggunakanl
pengubah panjang sebagai gantinya, misalnyaprintf("the size is %lu\n", (unsigned long)size);
; mendukung C89 dan sistem dengansize_t
lebih besar daripadalong
yang lebih rumit dan akan membutuhkan penggunaan sejumlah makro praprosesor.Ya ada. Itu
%zu
(seperti yang ditentukan dalam ANSI C99).size_t size = 1; printf("the size is %zu", size);
Perhatikan bahwa
size_t
unsigned, jadi%ld
salah ganda: pengubah panjang salah dan penentu konversi format salah. Jika Anda bertanya-tanya,%zd
adalah untukssize_t
(yang ditandatangani).sumber
MSDN , mengatakan bahwa Visual Studio mendukung awalan "I" untuk kode portabel pada platform 32 dan 64 bit.
size_t size = 10; printf("size is %Iu", size);
sumber