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

 
 
3 страниц V  < 1 2 3 >  
Reply to this topicStart new topic
> Можно ли в keil разбить #define на несколько строк ?
ViKo
сообщение Sep 27 2013, 19:54
Сообщение #16


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

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



Цитата(aaarrr @ Sep 27 2013, 22:44) *
Т.е. теперь БОЛЬШИЕ_БУКВЫ всегда оборачивать в {} безопасности для?

Зачем писать нарочито плохо, если можно без каких бы то ни было усилий написать хорошо и правильно?

На мой взгляд, макрос в виде функции выглядит логичнее, чем конструкция с довеском do ... while(0)
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Sep 27 2013, 20:01
Сообщение #17


Гуру
******

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



"Логичнее"? А что ведет себя совсем иначе - это ничего?
Go to the top of the page
 
+Quote Post
ViKo
сообщение Sep 27 2013, 20:04
Сообщение #18


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

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



Цитата(aaarrr @ Sep 27 2013, 22:44) *
Т.е. теперь БОЛЬШИЕ_БУКВЫ всегда оборачивать в {} безопасности для?

Не всегда. Только функции БОЛЬШИЕ_БУКВЫ();
КОНСТАНТЫ - не нужно.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Sep 27 2013, 20:09
Сообщение #19


Гуру
******

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



Цитата(ViKo @ Sep 28 2013, 00:04) *
Не всегда. Только функции БОЛЬШИЕ_БУКВЫ();
КОНСТАНТЫ - не нужно.

Правильно, константы я бы в таком коде превинтивно заворачивал в (). Во избежание.
Go to the top of the page
 
+Quote Post
ViKo
сообщение Sep 27 2013, 20:09
Сообщение #20


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

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



Цитата(aaarrr @ Sep 27 2013, 23:01) *
"Логичнее"? А что ведет себя совсем иначе - это ничего?

Ведет себя, именно, как функция. Набор выражений.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Sep 27 2013, 20:19
Сообщение #21


Гуру
******

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



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


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

Группа: Модераторы
Сообщений: 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
Сообщение #23


Гуру
******

Группа: Свой
Сообщений: 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
A. Fig Lee
сообщение Sep 28 2013, 02:14
Сообщение #24


Знающий
****

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



Цитата(MrYuran @ Sep 27 2013, 09:23) *
и обязательно в скобках do{}while(0)

Это уже "на все случаи жизни".
И так хорошо.
ИМХО.


--------------------
Верить нельзя никому, даже себе. Мне - можно.
Go to the top of the page
 
+Quote Post
Raven
сообщение Sep 28 2013, 05:41
Сообщение #25


Местный
***

Группа: Свой
Сообщений: 491
Регистрация: 16-01-05
Из: Санкт-Петербург
Пользователь №: 1 987



Цитата(MrYuran @ Sep 27 2013, 17:23) *
и обязательно в скобках do{}while(0)

Спасибо за интересный прием. Действительно полезно для макросов. Возьму на вооружение.
Go to the top of the page
 
+Quote Post
ViKo
сообщение Sep 28 2013, 07:47
Сообщение #26


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

Группа: Модераторы
Сообщений: 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
Сообщение #27


Местный
***

Группа: Свой
Сообщений: 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
Сообщение #28


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

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



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

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


Гуру
******

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



Прочитал все написанное но так и не понял почему так все сложно.
И я совершенно не представляю ситуацию когда не будет работать конструкция
Код
#define MacroName(параметры_если_есть) \
{ /*комментарий0 если нужен */ \
оператор1; /*комментарий1 если нужен */ \
оператор2; /*комментарий2 если нужен */ \
}

Будьте добры, приведите мне любой пример кода, где определенный так макрос будет работать некорректно. Неужто кто-то знает такая комбинацию компилятора, параметров и операторов, когда это будет работать иначе чем задумано программистом при написании этого макроса?
Пока что я пребываю в дремучем незнании и полной уверенности что оно работает, буду рад любому кто раскроет мне глаза на подлую сущность вещей.
Как говориться, "thanks in advance".
Go to the top of the page
 
+Quote Post
igorle
сообщение Sep 28 2013, 09:22
Сообщение #30


Местный
***

Группа: Свой
Сообщений: 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

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

 


RSS Текстовая версия Сейчас: 18th July 2025 - 08:02
Рейтинг@Mail.ru


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