Здесь у нас есть набор макросов C для использования препроцессора для выполнения операций с битовыми полями, и мы сталкиваемся с предупреждениями при попытке использовать эти макросы в Visual Studio. Проблема может быть продемонстрирована очень легко:
#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
Это не проблема поведения — в этом случае оператор <<
использоваться не будет, и это должно быть обнаружено во время компиляции. Но есть ли у кого-нибудь предложения о том, как переписать макрос, чтобы избежать предупреждения? Или, в противном случае, как переделать интерфейс макроса для этого?
заранее спасибо