Использование макросов в С - C (СИ)
Формулировка задачи:
Здравствуйте!
Любопытный вопрос недавно был задан мне на собеседовании. Я до сих пор на него не могу ответить.
Вопрос: По адресу 0x1715 расположен регистр некоторого внешнего устройства. Напишите макро, который устанавливает пятый бит этого регистра.
Все, что мне пришло в голову:
и вызов этого макроса:
Ответ не принят, т.к. в задании звучало, чтобы макрос сразу использовал адрес 0x1715, а не брал его из параметра. Как в макрос подставить вместо pVar сразу константу 0x1715. Обычной заменой не получается:
компилятор ругается. Есть решение?
#define r_Set(pVar) char r_Var = ((*(pVar)) | (1 << 5));\ ((*(pVar)) = r_Var)
char *p = (char *)0x1715; r_Set(p);
#define r_Set char r_Var = ((*(0x1715)) | (1 << 5));\ ((*(0x1715)) = r_Var)
Решение задачи: «Использование макросов в С»
textual
Листинг программы
#define set_bit5 do { (*((char*)0x1715)) |= 1 << 5; } while(0)
Объяснение кода листинга программы
#define set_bit5
- это определение макроса с именемset_bit5
.do {
- начало блока инструкций, которые будут выполняться в рамках макроса.(*((char*)0x1715))
- это выражение, которое деференцирует указатель на байт по адресу 0x1715 и выполняет операцию инкремента на 1 для пятого бита этого байта.|= 1 << 5
- это операция побитового ИЛИ, которая устанавливает пятый бит в 1.while(0)
- это цикл, который не выполняет никаких инструкций и служит для обеспечения последовательности выполнения макроса.}
- это конец блока инструкций.set_bit5
- это вызов макроса с именемset_bit5
. Таким образом, этот код устанавливает пятый бит байта по адресу 0x1715 в 1.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д