2016-05-17 3 views
4

Я пытаюсь разработать общий модуль UART для микроконтроллера PIC. То, что я пытаюсь сделать, это определить используемый UART, а затем препроцессор автоматически заменит его в других макросах (имена регистров).Замена макропроцессора препроцессора

Что-то вроде:

#define UART  5 
#define UART_RXREG U ## UART ## RXREG 

Это не работает, так как она расширяется до UUARTRXREG вместо U5RXREG.

Есть ли способ сделать это, или это просто невозможно?

Обратите внимание, что я не ищу простой конкатенации строк. Мне нужно, чтобы макрос UART сначала расширялся.

+0

Он отлично работает, если вы используете препроцессор, который поддерживает его. –

+1

Почему бы не использовать макрос с параметром? –

+0

@ IgnacioVazquez-Abrams: Какой препроцессор поддерживает его? С 'gcc -E',' UART_RXREG' расширяется до 'UUARTRXREG'. Я считаю, что это обязательное поведение. –

ответ

9

Вам нужен уровень макро косвенности так, что сцепленные маркеры могут быть расширены:

#define CONCAT3_(a,b,c) a##b##c 
#define CONCAT3(a,b,c) CONCAT3_(a,b,c) 

#define UART 5 
#define UART_RXREG CONCAT3(U,UART,RXREG) 
+0

Работает с MSVC. –

+0

Это работает! Спасибо. – andreia

1

Нет, это невозможно. Весь оператор конкатенации делает вставку двух жетонов вместе. Это похоже на то, что вы написали это сами, какой вид поражения. Это более полезно, если вы поссорились:

#define UART  5 
#define _UART_RXREG(x) U ## x ## RXREG 
#define UART_REXREG _UART_RXREG(UART) 

Здесь x заменяется UART, но он не будет расширен макро, период.

Я думаю, я должен спросить, что вы действительно пытаетесь сделать?

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