Как исправить предупреждение о конверсии в макросе?

Есть макрос, очищающий бит в числе по позиции начиная с наиболее значимого бита:
#define CLEAR_BIT_MSB(num, bit) ((num) &= ~(1 << ((sizeof(num) * 8) - 1 - (bit))))

Пытаюсь использовать его так:
CLEAR_BIT_MSB(bitmap[byte_offset], bit_offset);
Но сталкиваюсь с предупреждением от GCC:
error: conversion from 'int' to 'uint8_t' {aka 'unsigned char'} may change value [-Werror=conversion]
    9 | #define CLEAR_BIT_MSB(num, bit) ((num) &= ~(1 << ((sizeof(num) * 8) - 1 - (bit))))
      |                                           ^

bitmap это массив значений типа uint8_t.

Как исправить это предупреждение? Я не хочу в самом макросе прописывать uint8_t, хочу использовать его для любых типов не сталкиваясь с предупреждениями.
  • Вопрос задан
  • 725 просмотров
Решения вопроса 1
mrjbom
@mrjbom Автор вопроса
Для GCC смог использовать typeof:
#define CLEAR_BIT_MSB(num, bit) ((num) &= (typeof((num)))(~(1 << ((sizeof(num) * 8) - 1 - (bit)))))
.
Не для GCC можно использовать такой вариант:
#define CLEAR_BIT_MSB(num, num_type, bit) ((num) &= (num_type)(~(1 << ((sizeof(num) * 8) - 1 - (bit)))))

CLEAR_BIT_MSB(bitmap[byte_offset], uint8_t, bit_offset);
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы