Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Ошибка при работе с #define
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
Alexashka
Подстажите в чем ошибка, а то я походу туплю уже, но простая подстановка приводит к ошибке.

Определил я пин и порт для светодиода:
Код
#define LED2                        PORT_Pin_8                                // OUTPUT
#define LED2_PORT                MDR_PORTB  
#define LED2_PIN                LED2,MDR_PORTB


Затем значит определил функцию:
Код
#define on(Pin_Mask,Pin_Port)                        ((Pin_Port->RXTX) |= Pin_Mask)


И пытаюсь ее вызывать так:
Код
on(LED2_PIN);

Keil выдает ошибку #54-D: too few arguments in invocation of macro "on"
и ошибку #29: expected an expression

Если вместо LED2_PIN написать LED2,MDR_PORTB, т.е по сути то что определяет дефайн "LED2_PIN", то ошибки нет.
Т.е. вот так работает:
Код
on(LED2,MDR_PORTB);

Хотелось бы выкинуть этот порт, чтобы каждый раз его не писать при вызове функции on(), но как обойти ошибку?
XVR
Код
#define on_(Pin_Mask,Pin_Port)                        ((Pin_Port->RXTX) |= Pin_Mask)
#define on(v) on_(v)
on(LED2_PIN);
Но так нельзя будет вызвать on(LED2,MDR_PORTB);
Вот так - можно, но требует некоторой поддержки со стороны компилятора (хотя бы С99)
Код
#define on_(Pin_Mask,Pin_Port)                        ((Pin_Port->RXTX) |= Pin_Mask)
#define on(...) on_(__VA_ARGS__)
on(LED2_PIN);
Alexashka
Да, понял свою ошибку. Сначала компилятор в макрос on(arg1, arg2) подставляет первый аргумент, который в моем случае есть "LED2,MDR_PORTB", а во второй аргумент ему подставить уже нечего. По сути логично.
Вообщем сделал так:
Код
#define _on(Pin_Mask,Pin_Port)            ((Pin_Port->RXTX) |= Pin_Mask)
#define on(x)                        _on(x)


Вызов on(LED1_PIN); работает.
Теперь можно вызывать on(); если PIN "расписан" как положено - с битовой маской и именем порта, а если нет, то можно вызвать _on();, указав битовую маску и имя порта.

Спасибо, вопрос снят!
andrew_b
Цитата(Alexashka @ Oct 23 2014, 14:12) *
Да, понял свою ошибку. Сначала компилятор в макрос on(arg1, arg2) подставляет первый аргумент
Компилятор не подставляет. Подставляет препроцессор.
Цитата
Спасибо, вопрос снят!
Пока вы не разберётесь с тем, как устроен процесс компиляции в языке Си, будут появляться другие вопросы.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.