Apa perbedaan antara stdint.h
dan cstdint
?
Keduanya tersedia dalam MSVC (Visual Studio 2010) dan gcc-4.5.1. Juga keduanya menentukan intX_t
/ uintX_t
types (di mana X
ukuran dalam byte tipe).
- Jika alasan di kedua tajuk sama (tipe portabel), keputusan apa yang harus saya ambil untuk memutuskan salah satunya?
The stdint.h
mendefinisikan setiap jenis tanpa namespace, yang cstdint
jenis terletak pada std
namespace.
- Apakah ada alasan untuk menyertakan atau tidak menyertakan tipe yang ditentukan ke dalam
std
namespace? Apa perbedaan antara kedua tajuk?
cstdint
tidak memiliki ekstensi file dan menggunakan c
awalan, stdint.h
menggunakan .h
ekstensi.
- Apa konvensi penamaan untuk header ini? yang
c
awalan menunjukkan bahwa ini adalah sebuah perpustakaan C? ada alasan kurangnya ekstensi file dicstdint
?
<cstdint>
. Berikut kesalahan saya terima:./misc.h:7:10: fatal error: 'cstdint' file not found
.Jawaban:
Maksud asli di C ++ 98 adalah agar Anda menggunakan
<cstdint>
C ++, untuk menghindari pencemaran namespace global (yah, tidak<cstdint>
secara khusus, itu hanya ditambahkan di C ++ 11, tetapi<c*>
header secara umum).Namun, implementasi tetap dilakukan dengan meletakkan simbol ke dalam namespace global, dan C ++ 11 meratifikasi praktik ini [*]. Jadi, pada dasarnya Anda memiliki tiga opsi:
<cstdint>
dan baik sepenuhnya memenuhi syarat setiap jenis bilangan bulat yang Anda gunakan atau bawa ke ruang lingkup denganusing std::int32_t;
dll (mengganggu karena verbose, tapi itu cara yang tepat untuk melakukannya seperti untuk simbol lain di pustaka standar C ++)<stdint.h>
(sedikit buruk karena tidak digunakan lagi)<cstdint>
dan asumsikan implementasi Anda akan menempatkan simbol di namespace global (sangat buruk karena tidak dijamin).Dalam praktiknya, saya menduga bahwa sejumlah besar kode yang mengganggu menggunakan opsi terakhir, hanya karena mudah dilakukan secara tidak sengaja pada implementasi di mana
<cstdint>
meletakkan simbol di namespace global. Anda harus mencoba menggunakan yang pertama. Yang kedua memiliki satu keunggulan, yaitu dijamin untuk meletakkan barang-barang di namespace global daripada hanya mungkin melakukannya. Saya tidak berpikir itu sangat berguna, tetapi mungkin menghemat beberapa pengetikan jika itu prioritas Anda.Ada opsi keempat,
#include <cstdint>
diikuti olehusing namespace std;
yang terkadang berguna tetapi ada tempat yang tidak boleh Anda letakkanusing namespace std;
. Orang yang berbeda akan memiliki ide yang berbeda di mana tempat-tempat itu berada, tetapi "di tingkat teratas dalam file header" lebih buruk daripada "di tingkat teratas dalam file cpp", yang lebih buruk daripada "dalam lingkup terbatas". Beberapa orang tidak pernah menulisusing namespace std;
sama sekali.[*] Artinya, header standar C ++ diizinkan untuk meletakkan barang-barang di namespace global tetapi tidak diharuskan. Jadi, Anda harus menghindari bertabrakan dengan simbol-simbol itu, tetapi Anda tidak dapat benar-benar menggunakannya karena mungkin tidak ada. Pada dasarnya, namespace global di C ++ adalah ladang ranjau, cobalah untuk menghindarinya. Orang mungkin berpendapat bahwa komite telah meratifikasi praktik dengan implementasi yang hampir sama berbahayanya dengan menempel
using namespace std;
di tingkat atas dalam file header - perbedaannya adalah bahwa implementasi hanya melakukannya untuk simbol di pustaka standar C, sedangkanusing namespace std;
melakukannya untuk C ++ simbol -hanya juga. Ada bagian dalam standar C yang mencantumkan nama yang dicadangkan untuk penambahan standar di masa mendatang. Bukan ide yang sepenuhnya bodoh untuk memperlakukan nama-nama itu sebagai yang dicadangkan di namespace global C ++ juga, tapi itu tidak penting.sumber
<iostream>
,<vector>
,<cstdlib>
, selain dari yang termasuk untuk kompatibilitas C:<stdint.h>
,<stdlib.h>
. Dan ya, awalc
menunjukkan bahwa<cstdlib>
C ++ setara dengan header standar C<stdlib.h>
, bukan sepenuhnya baru untuk C ++ seperti<vector>
itu. Ada header C ++<complex>
, jadi kita hanya perlu berharap bahwa tidak ada versi C yang akan datang yang memperkenalkan header standar<omplex.h>
.<omplex.h>
, tidak<complex.h>
. Jika C ditambahkan<omplex.h>
, padanan C ++ akan menjadi<complex>
.Termasuk
cstdint
mengimpor nama simbol di namespace std dan mungkin di namespace Global.Termasuk
stdint.h
mengimpor nama simbol di namespace Global dan mungkin di namespace std.Fitur Pustaka standar C juga disediakan di pustaka Standar C ++ dan sebagai konvensi penamaan umum, fitur tersebut diawali oleh c ke nama yang sesuai di pustaka standar C.
Di C ++, Anda harus menggunakan:
dan sepenuhnya memenuhi syarat nama simbol yang Anda gunakan
std::
saat berada di C, Anda harus menggunakan:
Lampiran D (normatif) Fitur kompatibilitas [depr] menyatakan:
Header perpustakaan standar D.6 C
Yang termasuk:
Dan selanjutnya,
sumber
cstdint
adalah header C ++ 11,stdint.h
adalah header C99 (C dan C ++ adalah bahasa yang berbeda!)MSVC 2008 tidak mengandung
stdint.h
norcstdint
.Implementasi
cstdint
sebagian besar hanya#include <stdint.h>
dengan beberapa perbaikan namespace / bahasa.sumber
cstdint
perlu mengangkat implementasi ke dalam namespacestd
.stdint.h
. Tidak ada argumen yangcstdint
merupakan header C ++.stdint.h
bukan bagian dari C ++ 11. Sebenarnya itu dibutuhkan oleh C ++ 11. Anda bisa mengatakan, "int
dalam C ++ 11;long
dalam C99; C dan C ++ adalah bahasa yang berbeda!", Dan tidak ada bagian darinya yang salah. Contoh saya bahkan lebih menyesatkan, karena C ++ 11 merujuk sebagian ke C99 untuk mendefinisikan konten keduanyastdint.h
dancstdint
, tetapi tidak mengacu pada C untuk mendefinisikanint
.