Забудьте про визначення
Вони забруднить ваш код.
бітфілди?
struct RecordFlag {
unsigned isnew:1, isdeleted:1, ismodified:1, isexisting:1;
};
Ніколи не використовуйте це . Вас швидше хвилює швидкість, ніж економія на 4 в. Використання бітових полів насправді повільніше, ніж доступ до будь-якого іншого типу.
Однак бітові члени в структурах мають практичні недоліки. По-перше, впорядкованість бітів у пам'яті змінюється від компілятора до компілятора. Крім того, багато популярних компіляторів генерують неефективний код для читання та запису членів бітів , і є потенційно серйозні проблеми безпеки потоку пов’язані з бітовими полями (особливо у багатопроцесорних системах) через те, що більшість машин не може маніпулювати довільними наборами бітів у пам'яті, але повинен замість цього завантажувати та зберігати цілі слова. наприклад, наступне не буде безпечним для ниток, незважаючи на використання мутексу
Джерело: http://en.wikipedia.org/wiki/Bit_field :
І якщо вам потрібно більше причин не використовувати бітфілди, можливо, Реймонд Чен переконає вас у своєму "Старому новому реченні" : Аналіз витрат та вигод біт-полів для колекції булів на веб-сайті 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 є застарілим у 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?
Якщо ви хочете зменшити зв'язок (тобто зможете приховати значення констант і так змінити їх за бажанням, не потребуючи повної рекомпіляції), ви можете оголосити вкладиші як екстерн у заголовку та як постійний у файлі 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;
}
Однак ви не зможете використовувати перемикач на ці константи. Тож врешті-решт, виберіть свою отруту ... :-p