Dimentica i definite
Inquineranno il tuo codice.
campi di bit?
struct RecordFlag {
unsigned isnew:1, isdeleted:1, ismodified:1, isexisting:1;
};
Non usarlo mai . Sei più interessato alla velocità che all'economizzazione di 4 pollici. L'uso dei campi bit è in realtà più lento dell'accesso a qualsiasi altro tipo.
Tuttavia, i membri di bit nelle strutture presentano inconvenienti pratici. Innanzitutto, l'ordinamento dei bit in memoria varia da compilatore a compilatore. Inoltre, molti compilatori popolari generano un codice inefficiente per la lettura e la scrittura dei membri bit e vi sono problemi di sicurezza dei thread potenzialmente gravi relativi ai campi bit (in particolare sui sistemi multiprocessore) a causa del fatto che la maggior parte delle macchine non è in grado di manipolare insiemi arbitrari di bit in memoria, ma deve invece caricare e memorizzare parole intere. ad esempio, quanto segue non sarebbe sicuro per i thread, nonostante l'uso di un mutex
Fonte: http://en.wikipedia.org/wiki/Bit_field :
E se hai bisogno di più motivi per non usare i bitfield, forse Raymond Chen ti convincerà nel suo The Old New Thing Post: l'analisi costi-benefici dei bitfield per una raccolta di booleani su http://blogs.msdn.com/oldnewthing/ archive / 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;
}
Metterli in uno spazio dei nomi è bello. Se sono dichiarati nel tuo CPP o file di intestazione, i loro valori saranno in linea. Sarai in grado di utilizzare l'interruttore su questi valori, ma aumenterà leggermente l'accoppiamento.
Ah, sì: rimuovi la parola chiave statica . static è deprecato in C ++ quando usato come fai tu, e se uint8 è un tipo buildin, non ti servirà per dichiararlo in un'intestazione inclusa da più fonti dello stesso modulo. Alla fine, il codice dovrebbe essere:
namespace RecordType {
const uint8 xNew = 1;
const uint8 xDeleted = 2;
const uint8 xModified = 4;
const uint8 xExisting = 8;
}
Il problema di questo approccio è che il codice conosce il valore delle costanti, il che aumenta leggermente l'accoppiamento.
enum
Lo stesso di const int, con una digitazione leggermente più forte.
typedef enum { xNew = 1, xDeleted, xModified = 4, xExisting = 8 } RecordType;
Stanno comunque inquinando lo spazio dei nomi globale. A proposito ... Rimuovi il typedef . Stai lavorando in C ++. Quei dattiloscritti di enumerazioni e strutture stanno inquinando il codice più di ogni altra cosa.
Il risultato è un po ':
enum RecordType { xNew = 1, xDeleted, xModified = 4, xExisting = 8 } ;
void doSomething(RecordType p_eMyEnum)
{
if(p_eMyEnum == xNew)
{
// etc.
}
}
Come vedi, il tuo enum sta inquinando lo spazio dei nomi globale. Se metti questa enum in uno spazio dei nomi, avrai qualcosa del tipo:
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?
Se si desidera ridurre l'accoppiamento (ovvero essere in grado di nascondere i valori delle costanti e, quindi, modificarli come desiderato senza necessità di una ricompilazione completa), è possibile dichiarare gli inte come esterni nell'intestazione e come costanti nel file CPP , come nell'esempio seguente:
// Header.hpp
namespace RecordType {
extern const uint8 xNew ;
extern const uint8 xDeleted ;
extern const uint8 xModified ;
extern const uint8 xExisting ;
}
E:
// Source.hpp
namespace RecordType {
const uint8 xNew = 1;
const uint8 xDeleted = 2;
const uint8 xModified = 4;
const uint8 xExisting = 8;
}
Tuttavia, non sarai in grado di utilizzare l'interruttore su quelle costanti. Quindi alla fine, scegli il tuo veleno ... :-p