Esqueça as definições
Eles poluirão seu código.
campos de bits?
struct RecordFlag {
unsigned isnew:1, isdeleted:1, ismodified:1, isexisting:1;
};
Nunca use isso . Você está mais preocupado com a velocidade do que com a economia de 4 polegadas. Usar campos de bits é realmente mais lento que o acesso a qualquer outro tipo.
No entanto, membros de bit em estruturas têm desvantagens práticas. Primeiro, a ordem dos bits na memória varia de compilador para compilador. Além disso, muitos compiladores populares geram código ineficiente para leitura e gravação de membros de bits , e há problemas de segurança de encadeamento potencialmente graves relacionados a campos de bits (especialmente em sistemas com multiprocessadores) devido ao fato de a maioria das máquinas não poder manipular conjuntos arbitrários de bits na memória, mas deve carregar e armazenar palavras inteiras. por exemplo, o seguinte não seria seguro para threads, apesar do uso de um mutex
Fonte: http://en.wikipedia.org/wiki/Bit_field :
E se você precisar de mais motivos para não usar campos de bits, talvez Raymond Chen o convença em The Old New Thing Post: A análise de custo-benefício de campos de bits para uma coleção de booleanos em 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;
}
Colocá-los em um espaço para nome é legal. Se eles forem declarados no seu CPP ou arquivo de cabeçalho, seus valores serão incorporados. Você poderá usar esses valores, mas isso aumentará um pouco o acoplamento.
Ah, sim: remova a palavra-chave estática . static está obsoleto no C ++ quando usado como você e, se uint8 for do tipo buildin, não será necessário declarar isso em um cabeçalho incluído por várias fontes do mesmo módulo. No final, o código deve ser:
namespace RecordType {
const uint8 xNew = 1;
const uint8 xDeleted = 2;
const uint8 xModified = 4;
const uint8 xExisting = 8;
}
O problema dessa abordagem é que seu código conhece o valor de suas constantes, o que aumenta um pouco o acoplamento.
enum
O mesmo que const int, com uma digitação um pouco mais forte.
typedef enum { xNew = 1, xDeleted, xModified = 4, xExisting = 8 } RecordType;
Eles ainda estão poluindo o espaço para nome global, no entanto. A propósito ... Remova o typedef . Você está trabalhando em C ++. Esses typedefs de enumerações e estruturas estão poluindo o código mais do que qualquer outra coisa.
O resultado é meio que:
enum RecordType { xNew = 1, xDeleted, xModified = 4, xExisting = 8 } ;
void doSomething(RecordType p_eMyEnum)
{
if(p_eMyEnum == xNew)
{
// etc.
}
}
Como você vê, sua enumeração está poluindo o espaço para nome global. Se você colocar esse enum em um espaço para nome, terá algo como:
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 você quiser diminuir o acoplamento (ou seja, poder ocultar os valores das constantes e modificá-los conforme desejado, sem precisar de uma recompilação completa), poderá declarar as entradas como externas no cabeçalho e constantes no arquivo CPP , como no exemplo a seguir:
// 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;
}
Você não poderá usar o switch nessas constantes. Então, no final, escolha seu veneno ... :-p