Мне трудно понять работу макроса, определенного с помощью директив препроцессора.Директивы препроцессора в C: макросах с использованием __LINE__
макросъемки,
TRXEM_SPI_BEGIN()
определяется с помощью двух директив препроцессора реферируемых из двух файлов заголовков. Во-первых, я хочу заявить декларацию указанного макроса.
#define TRXEM_SPI_BEGIN() st(TRXEM_PORT_OUT &= ~TRXEM_SPI_SC_N_PIN; NOP();)
Как декларация макро st()
здесь отсутствует, я нашел, что это определено в другом файле заголовка и Ti показано ниже.
#define st(x) do { x } while (__LINE__ == -1)
Теперь, после объединения двух макросов, истинное определение макро TRXEM_SPI_BEGIN()
должно быть,
#define TRXEM_SPI_BEGIN() do {
(TRXEM_PORT_OUT &= ~TRXEM_SPI_SC_N_PIN; NOP();)
} while (__LINE__ == -1)
Этого код написан для работы внутри микроконтроллера, где TRXEM_PORT_OUT
, RXEM_SPI_SC_N_PIN
находящихся в памяти регистров и NOP
Инициирует цикл инструкций, который ничего не делает.
По моему пониманию, __LINE__
означает строку кода в файле c, где находится __LINE__
. Эта линия никогда не может быть равна -1
. т.е. эта петля всегда будет работать только один раз при условии, что __LINE__
никогда не может быть размещен в -1
месте в файле .c
. Проще говоря, -1
никогда не может быть значением __LINE__
.
Поэтому я считаю, что цикл do while()
здесь не нужен, и тот же выход мог быть достигнут просто без использования каких-либо циклов.
Я не понимаю функционирование этого макроса. Я был бы очень признателен, если бы кто-то мог это обсудить.
Эти являются (тип функции) макросы или макросы с не аргументами функций. –
Возможный дубликат [do {...} while (0) - для чего это полезно?] (Http://stackoverflow.com/questions/257418/do-while-0-what-is-it-good- для) –
В порядке я отредактирую вопрос. Спасибо –