Забудьте об определениях
Они загрязнят ваш код.
битовые поля?
struct RecordFlag {
unsigned isnew:1, isdeleted:1, ismodified:1, isexisting:1;
};
Никогда не используйте это. Вас больше заботит скорость, чем экономия 4-х интов. Использование битовых полей на самом деле медленнее, чем доступ к любому другому типу.
However, bit members in structs have practical drawbacks. First, the ordering of bits in memory varies from compiler to compiler. In addition, many popular compilers generate inefficient code for reading and writing bit members, and there are potentially severe thread safety issues relating to bit fields (especially on multiprocessor systems) due to the fact that most machines cannot manipulate arbitrary sets of bits in memory, but must instead load and store whole words. e.g the following would not be thread-safe, in spite of the use of a mutex
Источник: http://en.wikipedia.org/wiki/Bit_field:
И если вам нужно больше причин, чтобы не использовать битовые поля, возможно, Раймонд Чен убедит вас в своем сообщении The Old New Thing: Анализ рентабельности битовых полей для коллекция логических значений на 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;
}
Помещать их в пространство имен - это круто. Если они объявлены в вашем 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?
Если вы хотите уменьшить связь (т.е. иметь возможность скрыть значения констант и, таким образом, изменять их по желанию, не требуя полной перекомпиляции), вы можете объявить целые числа как 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
person
paercebal
schedule
21.09.2008
enum RecordType : uint8_t
сочетает в себе безопасность типовenum
с небольшим размеромuint8_t
, хотя вам все равно придется предоставлять побитовые операторы. - person Justin Time - Reinstate Monica   schedule 01.10.2019