реклама на сайте
подробности

 
 
> Можно ли в keil разбить #define на несколько строк ?
MiklPolikov
сообщение Sep 27 2013, 12:48
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 2 015
Регистрация: 23-01-07
Из: Москва
Пользователь №: 24 702



Вопрос : есть ли способ в Keil записать такую строку

#define VOLTAGE_RANGE_1 {PWR->CR &=~ PWR_CR_VOS_1; PWR->CR |= PWR_CR_VOS_0;}

в виде двух

#define VOLTAGE_RANGE_1 {PWR->CR &=~ PWR_CR_VOS_1;
PWR->CR |= PWR_CR_VOS_0;}

?


--------------------
Если у Вас нет практического опыта в данной теме- не вступайте в дискуссию и не пишите никаких теоретических рассуждений! Заранее спасибо !
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
aaarrr
сообщение Sep 27 2013, 20:19
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Этот "набор выражений" и ведет себя как набор не связанных друг с другом выражений, а не как функция.
Go to the top of the page
 
+Quote Post
ViKo
сообщение Sep 27 2013, 20:29
Сообщение #3


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(aaarrr @ Sep 27 2013, 23:19) *
Этот "набор выражений" и ведет себя как набор не связанных друг с другом выражений, а не как функция.

Да ну? Отличие только в том, что ничего не возвращает (всегда). Тот пример, что я показал, запросто можно оформить в виде функции.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Sep 27 2013, 20:50
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(ViKo @ Sep 28 2013, 00:29) *
Да ну? Отличие только в том, что ничего не возвращает (всегда). Тот пример, что я показал, запросто можно оформить в виде функции.

Понятно, в виде функции - это "#define MACRO {}"? Немного получше, но все равно не то.

А уж этому -
Код
#define WDELAY_RESTART();        \
  TIM7->EGR = TIM_EGR_UG;        \
  TIM7->SR = 0;                \
  TIM7->CR1 |= TIM_CR1_CEN;

- точно не место в ветке для начинающих. Разве что как пример того, как делать не следует никогда.
Примерно такой же "полезности" макрос:
Код
#define  10   5 + 5
Go to the top of the page
 
+Quote Post
ViKo
сообщение Sep 28 2013, 07:47
Сообщение #5


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(aaarrr @ Sep 27 2013, 23:50) *
Понятно, в виде функции - это "#define MACRO {}"? Немного получше, но все равно не то.

Хорошо, добавим фигурные скобки. Можете привести пример, когда такая конструкция будет работать неправильно?
Код
#define WDELAY_RESTART(); {     \
  TIM7->EGR = TIM_EGR_UG;        \
  TIM7->SR = 0;             \
  TIM7->CR1 |= TIM_CR1_CEN;     \
}
Go to the top of the page
 
+Quote Post
igorle
сообщение Sep 28 2013, 08:44
Сообщение #6


Местный
***

Группа: Свой
Сообщений: 338
Регистрация: 14-07-12
Пользователь №: 72 753



Цитата(ViKo @ Sep 28 2013, 10:47) *
Хорошо, добавим фигурные скобки. Можете привести пример, когда такая конструкция будет работать неправильно?
Код
#define WDELAY_RESTART(); {     \
  TIM7->EGR = TIM_EGR_UG;        \
  TIM7->SR = 0;             \
  TIM7->CR1 |= TIM_CR1_CEN;     \
}

Элементарно. Я исхожу из предположения, что точка с запятой здесь (WDELAY_RESTART(); ) поставлена умышленно:
Код
#define aaa(); { printf("Good style saves you\n"); }

int main()
{
    int i = 0;
    if (0)
        if (1)
            aaa();

    return 0;
}

Будет напечаттано сообщение? Проверьте здесь

Теперь предположим, что точка с запятой стоят ошибочно (а это скорее всего так и есть)
Попытайтесь скомпилировать этот код:

Код
#define aaa() { printf("XXX\n"); }

int main()
{
    if (0)
        if (1)
            aaa();
        else
            printf("Yo are so wrong\n");

    return 0;
}


Сообщение отредактировал igorle - Sep 28 2013, 08:34
Go to the top of the page
 
+Quote Post
ViKo
сообщение Sep 28 2013, 08:58
Сообщение #7


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(igorle @ Sep 28 2013, 11:44) *
Будет напечатано сообщение? Проверьте

Точка с запятой стоит намеренно. Но я, хоть убей не понимаю поведения codepad! Подставляю ту же строку из макро - и не печатает! (первый пример)
Go to the top of the page
 
+Quote Post
igorle
сообщение Sep 28 2013, 09:22
Сообщение #8


Местный
***

Группа: Свой
Сообщений: 338
Регистрация: 14-07-12
Пользователь №: 72 753



Цитата(ViKo @ Sep 28 2013, 11:58) *
Точка с запятой стоит намеренно. Но я, хоть убей не понимаю поведения codepad! Подставляю ту же строку из макро - и не печатает! (первый пример)

Такой результат получится с любым исправным компилятором. Если есть под рукой GCC - посмотрите результат препроцессора. У меня под рукой нет. Поэтому сделаем препроцессинг вручную.

Код
if (0)
    if (1)
        aaa();

превращается в
Код
if (0)
    if (1)
       ; { printf("Good style saves you\n"); };

Или, после причесывания
Код
if (0)
    if (1)
           ;
{
    printf("Good style saves you\n");
};


А вывод один - обрамляйте любую макрофункцию, состоящую более чем из вызова одной функции, do {} while(0), и будет вам счастье.

Цитата(Ruslan1 @ Sep 28 2013, 12:03) *
я совершенно не представляю ситуацию когда не будет работать конструкция
Код
#define MacroName(параметры_если_есть) \
{ /*комментарий0 если нужен */ \
оператор1; /*комментарий1 если нужен */ \
оператор2; /*комментарий2 если нужен */ \
}

Будьте добры, приведите мне любой пример кода, где определенный так макрос будет работать некорректно.

Ruslan1, выше был пример. Но я повторю его, так как выше смешал два случая:
Код
#define aaa() { printf("XXX\n"); }
if (1)
    aaa();
else
    printf("Yo are so wrong\n");

просто не скомпилируется.
Go to the top of the page
 
+Quote Post
ViKo
сообщение Sep 28 2013, 09:34
Сообщение #9


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(igorle @ Sep 28 2013, 12:08) *
Такой результат получится с любым исправным компилятором. Если есть под рукой GCC - посмотрите результат препроцессора. У меня под рукой нет. Поэтому сделаем препроцессинг вручную.
Код
if (0)
    if (1)
      ; { printf("Good style saves you\n"); };

Насчет GCC не скажу, но в Keil C-99 точка с запятой не отрывается от имени макрофункции.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- MiklPolikov   Можно ли в keil разбить #define на несколько строк ?   Sep 27 2013, 12:48
- - megajohn   Код#define VOLTAGE_RANGE_1 {\ PWR->CR ...   Sep 27 2013, 12:53
|- - MiklPolikov   Цитата(megajohn @ Sep 27 2013, 16:53) Код...   Sep 27 2013, 13:35
|- - Палыч   Цитата(MiklPolikov @ Sep 27 2013, 17:35) ...   Sep 27 2013, 14:48
|- - MiklPolikov   Цитата(Палыч @ Sep 27 2013, 18:48) Речь в...   Sep 27 2013, 14:56
- - MrYuran   и обязательно в скобках do{}while(0)   Sep 27 2013, 13:23
|- - A. Fig Lee   Цитата(MrYuran @ Sep 27 2013, 09:23) и об...   Sep 28 2013, 02:14
|- - Raven   Цитата(MrYuran @ Sep 27 2013, 17:23) и об...   Sep 28 2013, 05:41
- - Allregia   А почему не делать так: Код__INLINE void VOLTAGE_R...   Sep 27 2013, 16:55
- - ViKo   А я иногда делаю так Код#define WDELAY_RESTART...   Sep 27 2013, 17:55
- - aaarrr   Цитата(ViKo @ Sep 27 2013, 21:55) А я ино...   Sep 27 2013, 19:14
|- - Allregia   Цитата(aaarrr @ Sep 27 2013, 21:14) do {}...   Sep 27 2013, 19:21
||- - aaarrr   Цитата(Allregia @ Sep 27 2013, 23:21) Да,...   Sep 27 2013, 19:28
|- - ViKo   Цитата(aaarrr @ Sep 27 2013, 22:14) Чудов...   Sep 27 2013, 19:34
|- - aaarrr   Цитата(ViKo @ Sep 27 2013, 23:34) В данно...   Sep 27 2013, 19:39
|- - ViKo   Цитата(aaarrr @ Sep 27 2013, 22:39) Тогда...   Sep 27 2013, 19:41
|- - aaarrr   Цитата(ViKo @ Sep 27 2013, 23:41) На то д...   Sep 27 2013, 19:44
|- - ViKo   Цитата(aaarrr @ Sep 27 2013, 22:44) Т.е. ...   Sep 27 2013, 19:54
|- - ViKo   Цитата(aaarrr @ Sep 27 2013, 22:44) Т.е. ...   Sep 27 2013, 20:04
|- - aaarrr   Цитата(ViKo @ Sep 28 2013, 00:04) Не всег...   Sep 27 2013, 20:09
- - aaarrr   "Логичнее"? А что ведет себя совсем инач...   Sep 27 2013, 20:01
|- - ViKo   Цитата(aaarrr @ Sep 27 2013, 23:01) ...   Sep 27 2013, 20:09
|- - Ruslan1   Цитата(igorle @ Sep 28 2013, 12:22) Rusla...   Sep 28 2013, 11:08
||- - Flood   Цитата(Ruslan1 @ Sep 28 2013, 15:08) Это ...   Sep 28 2013, 11:50
||- - igorle   Поддерживаю предыдущего оратора. И еще. "фун...   Sep 28 2013, 15:38
||- - ViKo   Цитата(igorle @ Sep 28 2013, 18:38) Напри...   Sep 29 2013, 19:01
||- - Flood   Цитата(ViKo @ Sep 29 2013, 23:01) Что так...   Sep 29 2013, 20:03
|- - A. Fig Lee   Цитата(igorle @ Sep 28 2013, 05:22) А выв...   Sep 29 2013, 20:22
|- - aaarrr   Цитата(A. Fig Lee @ Sep 30 2013, 00:22) П...   Sep 29 2013, 20:56
|- - ig_z   QUOTE (A. Fig Lee @ Sep 29 2013, 23:22) Н...   Sep 29 2013, 21:16
- - Ruslan1   Прочитал все написанное но так и не понял почему т...   Sep 28 2013, 09:03


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 07:32
Рейтинг@Mail.ru


Страница сгенерированна за 0.01474 секунд с 7
ELECTRONIX ©2004-2016