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

 
 
> Можно ли в 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
Ruslan1
сообщение Sep 28 2013, 11:08
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 2 360
Регистрация: 6-03-06
Из: Кишинев
Пользователь №: 15 025



Цитата(igorle @ Sep 28 2013, 12:22) *
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

Сообщений в этой теме
- 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
|- - ViKo   Цитата(igorle @ Sep 28 2013, 12:08) Такой...   Sep 28 2013, 09:34
||- - 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 Текстовая версия Сейчас: 18th July 2025 - 16:50
Рейтинг@Mail.ru


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