Zapomnij o definicjach
Zanieczyszczą twój kod.
bitfields?
struct RecordFlag {
unsigned isnew:1, isdeleted:1, ismodified:1, isexisting:1;
};
Nigdy tego nie używaj . Bardziej interesuje Cię szybkość niż oszczędność 4 int. Korzystanie z pól bitowych jest w rzeczywistości wolniejsze niż dostęp do jakiegokolwiek innego typu.
Jednak elementy bitowe w strukturach mają praktyczne wady. Po pierwsze, kolejność bitów w pamięci różni się w zależności od kompilatora. Ponadto wiele popularnych kompilatorów generuje nieefektywny kod do odczytywania i zapisywania składowych bitów i istnieją potencjalnie poważne problemy z bezpieczeństwem wątków związane z polami bitowymi (szczególnie w systemach wieloprocesorowych), ponieważ większość maszyn nie może manipulować dowolnymi zestawami bitów w pamięci, ale zamiast tego musi ładować i przechowywać całe słowa. np. poniższe nie byłyby bezpieczne dla wątków, pomimo użycia muteksu
Źródło: http://en.wikipedia.org/wiki/Bit_field :
A jeśli potrzebujesz więcej powodów, aby nie używać pól bitowych, być może Raymond Chen przekona Cię w swoim poście The Old New Thing : Analiza kosztów i korzyści pól bitowych dla zbioru wartości logicznych pod adresem http://blogs.msdn.com/oldnewthing/ archiwum / 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;
}
Umieszczenie ich w przestrzeni nazw jest fajne. Jeśli są zadeklarowane w Twoim CPP lub pliku nagłówkowym, ich wartości zostaną wstawione. Będziesz mógł użyć przełącznika na tych wartościach, ale nieznacznie zwiększy to sprzężenie.
Ach, tak: usuń słowo kluczowe static . static jest przestarzałe w C ++, gdy jest używane tak jak ty, a jeśli uint8 jest typem kompilacji, nie będziesz tego potrzebować, aby zadeklarować to w nagłówku zawartym w wielu źródłach tego samego modułu. Na koniec kod powinien wyglądać następująco:
namespace RecordType {
const uint8 xNew = 1;
const uint8 xDeleted = 2;
const uint8 xModified = 4;
const uint8 xExisting = 8;
}
Problem z tym podejściem polega na tym, że twój kod zna wartość twoich stałych, co nieznacznie zwiększa sprzężenie.
enum
To samo co const int, z nieco silniejszym pisaniem.
typedef enum { xNew = 1, xDeleted, xModified = 4, xExisting = 8 } RecordType;
Jednak nadal zanieczyszczają globalną przestrzeń nazw. Przy okazji ... Usuń typedef . Pracujesz w C ++. Te typy definicji wyliczeń i struktur zanieczyszczają kod bardziej niż cokolwiek innego.
Wynik jest taki:
enum RecordType { xNew = 1, xDeleted, xModified = 4, xExisting = 8 } ;
void doSomething(RecordType p_eMyEnum)
{
if(p_eMyEnum == xNew)
{
// etc.
}
}
Jak widzisz, Twoje wyliczenie zanieczyszcza globalną przestrzeń nazw. Jeśli umieścisz to wyliczenie w przestrzeni nazw, będziesz mieć coś takiego:
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?
Jeśli chcesz zmniejszyć sprzężenie (tj. Móc ukryć wartości stałych, a więc zmodyfikować je zgodnie z potrzebami bez konieczności pełnej rekompilacji), możesz zadeklarować ints jako extern w nagłówku i jako stałe w pliku CPP , jak w poniższym przykładzie:
// Header.hpp
namespace RecordType {
extern const uint8 xNew ;
extern const uint8 xDeleted ;
extern const uint8 xModified ;
extern const uint8 xExisting ;
}
I:
// Source.hpp
namespace RecordType {
const uint8 xNew = 1;
const uint8 xDeleted = 2;
const uint8 xModified = 4;
const uint8 xExisting = 8;
}
Nie będziesz jednak mógł użyć przełącznika na tych stałych. Więc w końcu wybierz swoją truciznę ... :-p