2015-08-08 3 views
0

Я определил этот макрос:Multi-Довод ошибка Макроопределение

#define DEF_CONCAT(a, b)  a ## b 
#define _internal_RCC(gpio, io) DEF_CONCAT(RCC_GPIO, gpio) 
#define _internal_IO(gpio, io) DEF_CONCAT(GPIO, io) 

#define IO_CFG_OUTPUT(gpio) {rcc_periph_clock_enable(_internal_RCC(gpio));gpio_set_mode(gpio, GPIO_MODE_OUTPUT_50_MHZ, GPIO_CNF_OUTPUT_PUSHPULL, _internal_IO(gpio));} 

И я хочу назвать это с:

IO_CFG_OUTPUT(LED_STATE);

LED_STATE определяется как: #define LED_STATE C,12

Но когда Я запускаю свою программу, компилятор говорит мне:

In file included from inc/Robot.hpp:6:0, 
       from src/Robot.cpp:1: 
src/Robot.cpp: In member function 'void Robot::setup()': 
inc/IODefines.hpp:13:19: error: 'C' was not declared in this scope 
#define LED_STATE C,12 
       ^

Что я сделал не так?

+0

'#define LED_STATE C, 12' Это кажется неправильным, что вы намереваетесь делать? –

+0

да, но почему? Он должен использовать C как письмо, чтобы объединить его в IO_CFG_OUTPUT через DEF_CONCAT в RCC_GPIOC .. как? –

+1

Вы используете его также в 'gpio_set_mode (gpio, ..)', существует ли 'C'? Является ли 'gpio_set_mode' макросом? – Jarod42

ответ

2

Run gcc -E на источник, чтобы увидеть, что ваши макросы расширяться ...

Что расширяется в {rcc_periph_clock_enable(RCC_GPIOC);gpio_set_mode(C,12, GPIO_MODE_OUTPUT_50_MHZ, GPIO_CNF_OUTPUT_PUSHPULL, GPIO12);};. Или с более читаемым форматированием:

{ 
    rcc_periph_clock_enable(RCC_GPIOC); 
    gpio_set_mode(C,12, 
        GPIO_MODE_OUTPUT_50_MHZ, 
        GPIO_CNF_OUTPUT_PUSHPULL, 
        GPIO12); 
}; 

Примечания сомнительной практикой ввода с запятой после }, это может привести к удивительному поведению. Обычный способ расширения до составного оператора, который работает в обычном режиме, заключается в использовании do { body; } while(0)

Проблема в том, что C не определен нигде.

Сообщение об ошибке выглядит немного запутанным. В вашей директиве define нет ничего формального. Будут ли они делать то, что вы хотите, с другой стороны, я не могу сказать, вы должны это сказать.

+0

Абсолютно не решение, кстати, вы должны читать комментарии. он уже был решен. ошибка заключалась в том, что я использовал gpio в gpio_set_mode вместо _internal _... –

+0

Возможно, это не решение вашей проблемы, но я думаю, что это ответ на реальный вопрос (то есть «Что я сделал не так»). В аду нет никаких шансов сказать, что он должен быть внутренним ... *. – skyking

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