это странная ...
I я играю с некоторым алгоритмом декомпрессии. Вместо того, чтобы проходить через буфер символов []
и зацикливаться до тех пор, пока не будет найден стоп-бит в буфере [i]
, я пытаюсь использовать некоторые методы битовой маски, но с символами.
У меня есть следующий пример:
// In a *.h file
const char ch = '\x81';
// To avoid Endianess
union CharUInt
{
char sz[4];
unsigned int u;
};
// Legal because char[] is declared before uint32 in the union
const CharUInt Mask1 = {'\x81', '\x0', '\x0', '\x81'};
const CharUInt Mask2 = {'\x0', '\x81', '\x81', '\x0'};
// Proxy / Auxillary uint32 as usimg Mask2.u in the switch blocked produced the same errors
const unsigned int uMask1 = Mask1.u;
const unsigned int uMask2 = Mask2.u;
const unsigned int uMask_ = (uMask1 & uMask2);
// buf is always long enough
bool Foo(char buf[])
{
const CharUInt Type = {buf[0], buf[1], buf[2], buf[3]};
unsigned int uType = (Type.u & uMask_);
switch(uType)
{
case uMask1:
// do stuff
case uMask2:
// do more stuff
return true;
break;
default:
// do different stuff
return false;
break;
}
};
Без учета синтаксиса материала union
(фактический код компилируется для этого нормально) и без учета того, будет ли функция return для Foo
красиво, я получаю
'uMask1' не может появиться в константном выражении
, и если используются сами объединения, я получаю
'Mask1' не может появляться в константном выражении
'.' не может появиться в константном выражении
и, конечно же, ошибки также применимы к uMask2 и Mask2.u
Что мне не хватает?
Заранее спасибо