Использование макросов в С - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Здравствуйте! Любопытный вопрос недавно был задан мне на собеседовании. Я до сих пор на него не могу ответить. Вопрос: По адресу 0x1715 расположен регистр некоторого внешнего устройства. Напишите макро, который устанавливает пятый бит этого регистра. Все, что мне пришло в голову:
#define r_Set(pVar) char r_Var = ((*(pVar)) | (1 << 5));\
                    ((*(pVar)) = r_Var)
и вызов этого макроса:
char *p = (char *)0x1715;
r_Set(p);
Ответ не принят, т.к. в задании звучало, чтобы макрос сразу использовал адрес 0x1715, а не брал его из параметра. Как в макрос подставить вместо pVar сразу константу 0x1715. Обычной заменой не получается:
#define r_Set char r_Var = ((*(0x1715)) | (1 << 5));\
              ((*(0x1715)) = r_Var)
компилятор ругается. Есть решение?

Решение задачи: «Использование макросов в С»

textual
Листинг программы
#define set_bit5 do { (*((char*)0x1715)) |= 1 << 5; } while(0)

Объяснение кода листинга программы

  1. #define set_bit5 - это определение макроса с именем set_bit5.
  2. do { - начало блока инструкций, которые будут выполняться в рамках макроса.
  3. (*((char*)0x1715)) - это выражение, которое деференцирует указатель на байт по адресу 0x1715 и выполняет операцию инкремента на 1 для пятого бита этого байта.
  4. |= 1 << 5 - это операция побитового ИЛИ, которая устанавливает пятый бит в 1.
  5. while(0) - это цикл, который не выполняет никаких инструкций и служит для обеспечения последовательности выполнения макроса.
  6. } - это конец блока инструкций.
  7. set_bit5 - это вызов макроса с именем set_bit5. Таким образом, этот код устанавливает пятый бит байта по адресу 0x1715 в 1.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 4 из 5
Похожие ответы