|
Можно ли в keil разбить #define на несколько строк ? |
|
|
|
 |
Ответов
|
Sep 27 2013, 20:50
|
Гуру
     
Группа: Свой
Сообщений: 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
|
|
|
|
|
Sep 28 2013, 08:44
|
Местный
  
Группа: Свой
Сообщений: 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
|
|
|
|
|
Sep 28 2013, 09:22
|
Местный
  
Группа: Свой
Сообщений: 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"); просто не скомпилируется.
|
|
|
|
Сообщений в этой теме
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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|