У нас есть набор макросов C, здесь, для использования препроцессора для выполнения операций с битовыми полями, и мы сталкиваемся с предупреждениями при попытке использовать эти макросы в визуальной студии. Проблема может быть продемонстрировано очень легко:Макрос вычисления битовой маски
#define BITFIELD_WIDTHMASK(Width) \
((Width) >= 32 ? ~0x0ul : (1ul << (Width)) - 1)
unsigned long foo(void)
{
return BITFIELD_WIDTHMASK(32);
}
Компиляция это с MSVC дает предупреждение:
test.c(12) : warning C4293: '<<' : shift count negative or too big, undefined behavior
Это не проблема поведения - оператор <<
не будет использоваться в данном случае, и это должно быть обнаружено во время компиляции. Но есть ли какие-либо предложения о том, как переписать макрос, чтобы избежать предупреждения? Или, если это не так, как перепроектировать интерфейс макроса для этого?
Заранее спасибо
Работает и чист и плотно. Точно, что я был после. Благодаря! –
Это так же эффективно, когда Width является константой. Однако, если это переменная, она может иметь более низкую эффективность выполнения, чем изменение, если это имеет значение. Все еще; охватывает все основы. +1. – Clifford