Что такое "##" в C?

Я использую USART в Keil и видел это;

#define USART_DRV_NUM 6

#define USART_BAUDRATE 9600

#define _USART_Driver_(n) Driver_USART##n
#define USART_Driver_(n) _USART_Driver_(n)

extern ARM_DRIVER_USART USART_Driver_(USART_DRV_NUM);
#define ptrUSART (&USART_Driver_(USART_DRV_NUM))

Вот в чем дело;

#define _USART_Driver_(n) Driver_USART##n

Я не нашел примеров в Интернете. Кто-нибудь что-нибудь знает об этой штуке?


person Arif Ahmet Balık    schedule 08.02.2016    source источник


Ответы (1)


Это называется Оператор вставки токена. Он генерирует идентификатор, например

#define _USART_Driver_(n) Driver_USART##n

int _USART_Driver_(_EXAMPLE);

переводится на

int Driver_USART_EXAMPLE;

Обратите внимание, что n не является переменной. Он заменяется буквально перед компиляцией на этапе предварительной обработки.

person Iharob Al Asimi    schedule 08.02.2016
comment
Спасибо за ответ. Могу я использовать это в цикле? Например; while (i -) {husart.instance = _USART_Driver_ (i)} - person Arif Ahmet Balık; 09.02.2016
comment
Нет, не можешь. Он заменяется во время компиляции, n не может быть переменной. - person Iharob Al Asimi; 09.02.2016
comment
Могу ли я использовать что-нибудь подобное в цикле? - person Arif Ahmet Balık; 09.02.2016
comment
Да массив. Что ты пытаешься сделать? - person Iharob Al Asimi; 09.02.2016
comment
Я не хочу использовать массив. Этот оператор вставки токена кажется очень чистым. Массив занимает больше памяти, чем этот макрос. - person Arif Ahmet Balık; 09.02.2016
comment
Что ты пытаешься сделать? Возможно, это не тот вариант, который вам подходит. - person Iharob Al Asimi; 09.02.2016
comment
У меня есть ввод. Например: init -usart 6 и мне нужно инициализировать USART6 :) - person Arif Ahmet Balık; 09.02.2016
comment
Могу ли я использовать enum для этого макроса? - person Arif Ahmet Balık; 09.02.2016
comment
Нет, макросы - это время компиляции, и вам нужно решение во время выполнения, оно вообще не будет работать с макросами. - person Iharob Al Asimi; 09.02.2016
comment
Итак, мне нужно использовать массив? Это самый эффективный метод? - person Arif Ahmet Balık; 09.02.2016
comment
Пожалуй, я не могу вам сказать, не увидев АКТУАЛЬНОЙ проблемы. Вы можете прислать его мне на [email protected], и я посмотрю. Кстати: انا اسمي يعرب - person Iharob Al Asimi; 09.02.2016