Вы должны просмотреть static const
vs #define
in C.
Это звучит так, как будто вы используете перечислений общего вида:
enum
{
FLAG_A = 0x00000001, FLAG_B = 0x00000002, FLAG_C = 0x00000004, FLAG_D = 0x00000008,
...
};
Вы также объединить эти различные значения перечисления в (32-бит) unsigned int
значение с поразрядными операций. Теперь вы достигли предела; у вас более 32 флагов (и я надеюсь, что они более значимо названы, чем в моем примере).
Вы можете решить начать новую серию перечислений, используя второе 32-разрядное (без знака) целое число для хранения бит. Это имеет смысл хранить символы в отлаживаемой программе (в отличие от констант #define
, которые редко доступны даже в отлаживаемых программах). Недостатком является то, что вам может потребоваться передать два значения, где ранее вы их передали.
Если необходимо сохранить флаги в одной переменной, вам нужно будет проверить, лучше ли использовать unsigned long long
, или, возможно, структура с двумя значениями unsigned int
будет работать.
Я согласен, что лучше не использовать битовые поля, хотя они могут работать достаточно хорошо. Я бы также пошел на значительные усилия, чтобы избежать использования #define
и, вероятно, использовал бы либо две 32-битные переменные, либо структуру. Многое зависит от вашей базы кода и от того, насколько широко используются значения.
Что вы говорите, что битполы не являются стандартными? –
Ну, некоторые здесь, на SO ... «не используют битовые поля, не переносимы» –
Битвые поля не очень портативны, и, как правило, лучше их не использовать, но они определяются стандартом. Есть много аспектов, связанных с реализацией, для битовых полей, но они являются стандартными. –