Забудьте об определениях
Они будут загрязнять ваш код.
битовые?
struct RecordFlag {
unsigned isnew:1, isdeleted:1, ismodified:1, isexisting:1;
};
Никогда не используйте это . Вас больше заботит скорость, чем экономия 4-х единиц. Использование битовых полей на самом деле медленнее, чем доступ к любому другому типу.
Однако битовые члены в структурах имеют практические недостатки. Во-первых, порядок битов в памяти варьируется от компилятора к компилятору. Кроме того, многие популярные компиляторы генерируют неэффективный код для чтения и записи битовых элементов , и существуют потенциально серьезные проблемы безопасности потоков, связанные с битовыми полями (особенно в многопроцессорных системах) из-за того, что большинство машин не могут манипулировать произвольными наборами битов в памяти, но вместо этого должен загружать и хранить целые слова. например, следующее не будет потокобезопасным, несмотря на использование мьютекса
Источник: http://en.wikipedia.org/wiki/Bit_field :
И если вам нужно больше причин не использовать битовые поля, возможно, Рэймонд Чен убедит вас в своей статье The Old New Thing Post: Анализ затрат и выгод битовых полей для набора логических значений на http://blogs.msdn.com/oldnewthing/ Архив / 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;
}
Помещать их в пространство имен - это круто. Если они объявлены в вашем CPP или файле заголовка, их значения будут встроены. Вы сможете использовать переключатель для этих значений, но это немного увеличит связь.
Ах, да: удалите ключевое слово static . static не рекомендуется в C ++ при использовании в том же порядке, и если uint8 является типом сборки, вам не нужно это объявлять в заголовке, включенном несколькими источниками одного и того же модуля. В итоге код должен быть:
namespace RecordType {
const uint8 xNew = 1;
const uint8 xDeleted = 2;
const uint8 xModified = 4;
const uint8 xExisting = 8;
}
Проблема этого подхода в том, что ваш код знает значение ваших констант, что немного увеличивает связь.
перечисление
То же, что и const int, с несколько более строгим типированием.
typedef enum { xNew = 1, xDeleted, xModified = 4, xExisting = 8 } RecordType;
Однако они все еще загрязняют глобальное пространство имен. Кстати ... Удалите typedef . Вы работаете на C ++. Эти определения перечислений и структур загрязняют код больше, чем что-либо другое.
Результат вроде бы:
enum RecordType { xNew = 1, xDeleted, xModified = 4, xExisting = 8 } ;
void doSomething(RecordType p_eMyEnum)
{
if(p_eMyEnum == xNew)
{
// etc.
}
}
Как видите, ваше перечисление загрязняет глобальное пространство имен. Если вы поместите это перечисление в пространство имен, у вас будет что-то вроде:
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?
Если вы хотите уменьшить связь (то есть иметь возможность скрыть значения констант и, таким образом, изменять их по желанию, не требуя полной перекомпиляции), вы можете объявить целые числа как extern в заголовке и как константы в файле CPP. , как в следующем примере:
// Header.hpp
namespace RecordType {
extern const uint8 xNew ;
extern const uint8 xDeleted ;
extern const uint8 xModified ;
extern const uint8 xExisting ;
}
И:
// Source.hpp
namespace RecordType {
const uint8 xNew = 1;
const uint8 xDeleted = 2;
const uint8 xModified = 4;
const uint8 xExisting = 8;
}
Однако вы не сможете использовать switch для этих констант. Итак, в конце концов, выберите свой яд ... :-p