Saya menulis kode uji printf uint64_t yang sangat sederhana:
#include <inttypes.h>
#include <stdio.h>
int main()
{
uint64_t ui64 = 90;
printf("test uint64_t : %" PRIu64 "\n", ui64);
return 0;
}
Saya menggunakan ubuntu 11.10 (64 bit) dan gcc versi 4.6.1 untuk mengkompilasinya, tetapi gagal:
main.cpp: In function ‘int main()’:
main.cpp:9:30: error: expected ‘)’ before ‘PRIu64’
main.cpp:9:47: warning: spurious trailing ‘%’ in format [-Wformat]
main.c
dan mengompilasinya dengan gcc, semua akan berfungsi dengan baik.-std=c11
atau versi standar yang Anda gunakan. Itu menangkap kesalahan ini dan lainnya. Saya juga merekomendasikan-Wall -Wextra -Wpedantic -Wconversion
setidaknya.Jawaban:
Standar ISO C99 menetapkan bahwa makro ini hanya boleh didefinisikan jika diminta secara eksplisit.
sumber
__STDC_FORMAT_MACROS
makro hanya diperlukan untuk dimasukkan dalam C ++.__STDC_FORMAT_MACROS
hanya muncul di catatan kaki di C99, menunjukkan bahwa C ++ hanya mendefinisikan makro ini di hadapan permintaan. Namun komite C ++ memilih untuk mengabaikan saran: misalnya dalam konsep n3242, 27.9.2 / 3: Catatan: Makro yang didefinisikan oleh <cinttypes> disediakan tanpa syarat. Secara khusus, simbol __STDC_FORMAT_MACROS, yang disebutkan dalam catatan kaki 182 dari standar C, tidak memainkan peran dalam C ++. Jadi ketika kompiler mengejar, kita tidak perlu__STDC_FORMAT_MACROS
dalam C atau C ++.-std=c++0x
dan mungkin #include <cinttypes> daripada <inttypes.h>, saya percaya itu akan memberikan format makro tanpa Anda berikan__STDC_FORMAT_MACROS
.Ketika mengkompilasi memcached di bawah Centos 5.xi mendapat masalah yang sama.
Solusinya adalah dengan memperbarui gcc dan g ++ ke versi 4.4 setidaknya.
Pastikan CC / CXX Anda disetel (diekspor) ke binari kanan sebelum dikompilasi.
sumber
Karena Anda memasukkan tag C ++, Anda bisa menggunakan pustaka {fmt} dan menghindari masalah
PRIu64
makro dan lainnyaprintf
:Fasilitas format berdasarkan pustaka ini diusulkan untuk standardisasi dalam C ++ 20: P0645 .
Penafian : Saya penulis {fmt}.
sumber
sscanf
?scanf
.std::to_string()
. Halaman cppreference masih terhubung hanya kestd::to_chars()
, yang sebenarnya tidak dibutuhkan orang. Saya ingin tahu apakahfmt
dan / atau c ++ 20 menghadapinya atau belum.std::to_string
mungkin akan tetap apa adanya, tetapistd::format
memungkinkan Anda untuk mengontrol apakah akan menggunakan lokal atau tidak (dan secara default tidak menggunakan lokal).