Lupakan definisi
Mereka akan mencemari kode Anda.
bitfields?
struct RecordFlag {
unsigned isnew:1, isdeleted:1, ismodified:1, isexisting:1;
};
Jangan pernah gunakan itu . Anda lebih mementingkan kecepatan daripada menghemat 4 int. Menggunakan bidang bit sebenarnya lebih lambat dari akses ke jenis lainnya.
Namun, anggota bit dalam struct memiliki kelemahan praktis. Pertama, urutan bit dalam memori bervariasi dari kompiler ke kompiler. Selain itu, banyak kompiler populer menghasilkan kode yang tidak efisien untuk membaca dan menulis anggota bit , dan ada potensi masalah keamanan yang parah terkait dengan bidang bit (terutama pada sistem multiprosesor) karena fakta bahwa sebagian besar mesin tidak dapat memanipulasi set bit sewenang-wenang dalam memori, tetapi sebaliknya harus memuat dan menyimpan seluruh kata. misalnya yang berikut ini tidak akan aman untuk thread, terlepas dari penggunaan mutex
Sumber: http://en.wikipedia.org/wiki/Bit_field :
Dan jika Anda memerlukan lebih banyak alasan untuk tidak menggunakan bitfield, mungkin Raymond Chen akan meyakinkan Anda dalam bukunya The Old New Thing Post: Analisis biaya-manfaat bitfields untuk koleksi boolean di http://blogs.msdn.com/oldnewthing/ arsip / 2008/11/26 / 9143050.aspx
const int?
namespace RecordType {
static const uint8 xNew = 1;
static const uint8 xDeleted = 2;
static const uint8 xModified = 4;
static const uint8 xExisting = 8;
}
Menempatkan mereka di namespace itu keren. Jika mereka dideklarasikan dalam file CPP atau header Anda, nilainya akan diuraikan. Anda dapat menggunakan sakelar pada nilai-nilai itu, tetapi akan sedikit meningkatkan kopling.
Ah, ya: hapus kata kunci statis . statis ditinggalkan dalam C ++ ketika digunakan seperti yang Anda lakukan, dan jika uint8 adalah tipe buildin, Anda tidak akan memerlukan ini untuk mendeklarasikan ini di header yang disertakan oleh banyak sumber dari modul yang sama. Pada akhirnya, kodenya harus:
namespace RecordType {
const uint8 xNew = 1;
const uint8 xDeleted = 2;
const uint8 xModified = 4;
const uint8 xExisting = 8;
}
Masalah dari pendekatan ini adalah bahwa kode Anda mengetahui nilai konstanta Anda, yang sedikit meningkatkan kopling.
enum
Sama seperti const int, dengan pengetikan yang agak kuat.
typedef enum { xNew = 1, xDeleted, xModified = 4, xExisting = 8 } RecordType;
Mereka masih mencemari namespace global. Omong-omong ... Hapus typedef . Anda bekerja di C ++. Jenis-jenis enum dan struct itu mencemari kode lebih dari apa pun.
Hasilnya agak:
enum RecordType { xNew = 1, xDeleted, xModified = 4, xExisting = 8 } ;
void doSomething(RecordType p_eMyEnum)
{
if(p_eMyEnum == xNew)
{
// etc.
}
}
Seperti yang Anda lihat, enum Anda mencemari namespace global. Jika Anda meletakkan enum ini di namespace, Anda akan memiliki sesuatu seperti:
namespace RecordType {
enum Value { xNew = 1, xDeleted, xModified = 4, xExisting = 8 } ;
}
void doSomething(RecordType::Value p_eMyEnum)
{
if(p_eMyEnum == RecordType::xNew)
{
// etc.
}
}
extern const int?
Jika Anda ingin mengurangi kopling (yaitu dapat menyembunyikan nilai konstanta, dan karenanya, memodifikasinya seperti yang diinginkan tanpa memerlukan kompilasi ulang penuh), Anda dapat mendeklarasikan int sebagai extern di header, dan sebagai konstanta pada file CPP , seperti pada contoh berikut:
// Header.hpp
namespace RecordType {
extern const uint8 xNew ;
extern const uint8 xDeleted ;
extern const uint8 xModified ;
extern const uint8 xExisting ;
}
Dan:
// Source.hpp
namespace RecordType {
const uint8 xNew = 1;
const uint8 xDeleted = 2;
const uint8 xModified = 4;
const uint8 xExisting = 8;
}
Anda tidak akan dapat menggunakan sakelar pada konstanta itu. Jadi pada akhirnya, pilih racunmu ... :-p