2015-05-08 6 views
0

Мне трудно понять работу макроса, определенного с помощью директив препроцессора.Директивы препроцессора в 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() здесь не нужен, и тот же выход мог быть достигнут просто без использования каких-либо циклов.

Я не понимаю функционирование этого макроса. Я был бы очень признателен, если бы кто-то мог это обсудить.

+1

Эти являются (тип функции) макросы или макросы с не аргументами функций. –

+4

Возможный дубликат [do {...} while (0) - для чего это полезно?] (Http://stackoverflow.com/questions/257418/do-while-0-what-is-it-good- для) –

+0

В порядке я отредактирую вопрос. Спасибо –

ответ

1

Согласно моему пониманию, означает строку кода в файл Си где __LINE__ ложь. Эта строка никогда не может быть равна -1. то есть этот циклвсегда работает только один раз, если __LINE__ никогда не может быть помещен в -1 место в .c файле. Проще говоря, -1 никогда не может быть возвращаемым значением до __LINE__.

Ваше понимание здесь совершенно верно. Он должен убедиться, что код работает ровно один раз.

Придумайте следующего сценария:

#define BAZ foo();bar(); 

Теперь, если вы

if(some_cond) BAZ; 

Это эквивалентно:

if(some_cond) foo(); 
bar(); 

Что наиболее вероятно, не то, что вы хотите.Таким образом, вы измените его на:

#define BAZ {foo();bar();} 

Это прекрасно работает, если записать в виде if(some_cond) foo() else wow();, но потерпит неудачу компиляции, если записать в виде if(some_cond) foo(); else wow();

Так вы определите BAZ, как

/* No semicolon at end */ 
#define BAZ do {foo();bar();} while(condition_which_is_always_false) 

И теперь вы можете написать естественный код с интуитивной точкой с запятой в конце.

В вашем случае, condition_which_is_always_false является __LINE__ == -1

+0

Спасибо @mohitJain. Поистине оцените ваши усилия. Когда я впервые изучил вашу ссылку, это не имело большого смысла для меня. Теперь это действительно имеет смысл и благодарит вас за ваше терпение. Поистине ценим это. –

+0

Я рад, если это поможет. Вы также можете найти [это] (http://stackoverflow.com/questions/28985515/is-warning-c4127-conditional-expression-is-constant-ever-helpful) интересно. –

Смежные вопросы