|
|
  |
Можно ли в 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, 02:14
|

Знающий
   
Группа: Участник
Сообщений: 974
Регистрация: 4-04-08
Из: далека
Пользователь №: 36 467

|
Цитата(MrYuran @ Sep 27 2013, 09:23)  и обязательно в скобках do{}while(0) Это уже "на все случаи жизни". И так хорошо. ИМХО.
--------------------
Верить нельзя никому, даже себе. Мне - можно.
|
|
|
|
|
Sep 28 2013, 05:41
|
Местный
  
Группа: Свой
Сообщений: 491
Регистрация: 16-01-05
Из: Санкт-Петербург
Пользователь №: 1 987

|
Цитата(MrYuran @ Sep 27 2013, 17:23)  и обязательно в скобках do{}while(0) Спасибо за интересный прием. Действительно полезно для макросов. Возьму на вооружение.
|
|
|
|
|
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:03
|
Гуру
     
Группа: Свой
Сообщений: 2 360
Регистрация: 6-03-06
Из: Кишинев
Пользователь №: 15 025

|
Прочитал все написанное но так и не понял почему так все сложно. И я совершенно не представляю ситуацию когда не будет работать конструкция Код #define MacroName(параметры_если_есть) \ { /*комментарий0 если нужен */ \ оператор1; /*комментарий1 если нужен */ \ оператор2; /*комментарий2 если нужен */ \ } Будьте добры, приведите мне любой пример кода, где определенный так макрос будет работать некорректно. Неужто кто-то знает такая комбинацию компилятора, параметров и операторов, когда это будет работать иначе чем задумано программистом при написании этого макроса? Пока что я пребываю в дремучем незнании и полной уверенности что оно работает, буду рад любому кто раскроет мне глаза на подлую сущность вещей. Как говориться, "thanks in advance".
|
|
|
|
|
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"); просто не скомпилируется.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|