Jump to content

    

Можно ли в keil разбить #define на несколько строк ?

Т.е. теперь БОЛЬШИЕ_БУКВЫ всегда оборачивать в {} безопасности для?

 

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

На мой взгляд, макрос в виде функции выглядит логичнее, чем конструкция с довеском do ... while(0)

Share this post


Link to post
Share on other sites

"Логичнее"? А что ведет себя совсем иначе - это ничего?

Share this post


Link to post
Share on other sites
Т.е. теперь БОЛЬШИЕ_БУКВЫ всегда оборачивать в {} безопасности для?

Не всегда. Только функции БОЛЬШИЕ_БУКВЫ();

КОНСТАНТЫ - не нужно.

Share this post


Link to post
Share on other sites
Не всегда. Только функции БОЛЬШИЕ_БУКВЫ();

КОНСТАНТЫ - не нужно.

Правильно, константы я бы в таком коде превинтивно заворачивал в (). Во избежание.

Share this post


Link to post
Share on other sites
"Логичнее"? А что ведет себя совсем иначе - это ничего?

Ведет себя, именно, как функция. Набор выражений.

Share this post


Link to post
Share on other sites

Этот "набор выражений" и ведет себя как набор не связанных друг с другом выражений, а не как функция.

Share this post


Link to post
Share on other sites
Этот "набор выражений" и ведет себя как набор не связанных друг с другом выражений, а не как функция.

Да ну? Отличие только в том, что ничего не возвращает (всегда). Тот пример, что я показал, запросто можно оформить в виде функции.

Share this post


Link to post
Share on other sites
Да ну? Отличие только в том, что ничего не возвращает (всегда). Тот пример, что я показал, запросто можно оформить в виде функции.

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

 

А уж этому -

#define WDELAY_RESTART();        \
  TIM7->EGR = TIM_EGR_UG;        \
  TIM7->SR = 0;                \
  TIM7->CR1 |= TIM_CR1_CEN;

- точно не место в ветке для начинающих. Разве что как пример того, как делать не следует никогда.

Примерно такой же "полезности" макрос:

#define  10   5 + 5

Share this post


Link to post
Share on other sites
и обязательно в скобках do{}while(0)

Это уже "на все случаи жизни".

И так хорошо.

ИМХО.

 

Share this post


Link to post
Share on other sites
и обязательно в скобках do{}while(0)

Спасибо за интересный прием. Действительно полезно для макросов. Возьму на вооружение.

Share this post


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

Хорошо, добавим фигурные скобки. Можете привести пример, когда такая конструкция будет работать неправильно?

#define WDELAY_RESTART(); {     \
  TIM7->EGR = TIM_EGR_UG;        \
  TIM7->SR = 0;             \
  TIM7->CR1 |= TIM_CR1_CEN;     \
}

Share this post


Link to post
Share on other sites
Хорошо, добавим фигурные скобки. Можете привести пример, когда такая конструкция будет работать неправильно?

#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;
}

Edited by igorle

Share this post


Link to post
Share on other sites
Будет напечатано сообщение? Проверьте

Точка с запятой стоит намеренно. Но я, хоть убей не понимаю поведения codepad! Подставляю ту же строку из макро - и не печатает! (первый пример)

Share this post


Link to post
Share on other sites

Прочитал все написанное но так и не понял почему так все сложно.

И я совершенно не представляю ситуацию когда не будет работать конструкция

#define MacroName(параметры_если_есть) \ 
{ /*комментарий0 если нужен */ \
оператор1; /*комментарий1 если нужен */ \ 
оператор2; /*комментарий2 если нужен */ \
}

Будьте добры, приведите мне любой пример кода, где определенный так макрос будет работать некорректно. Неужто кто-то знает такая комбинацию компилятора, параметров и операторов, когда это будет работать иначе чем задумано программистом при написании этого макроса?

Пока что я пребываю в дремучем незнании и полной уверенности что оно работает, буду рад любому кто раскроет мне глаза на подлую сущность вещей.

Как говориться, "thanks in advance".

 

Share this post


Link to post
Share on other sites
Точка с запятой стоит намеренно. Но я, хоть убей не понимаю поведения 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), и будет вам счастье.

 

я совершенно не представляю ситуацию когда не будет работать конструкция

#define MacroName(параметры_если_есть) \ 
{ /*комментарий0 если нужен */ \
оператор1; /*комментарий1 если нужен */ \ 
оператор2; /*комментарий2 если нужен */ \
}

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

Ruslan1, выше был пример. Но я повторю его, так как выше смешал два случая:

#define aaa() { printf("XXX\n"); }
if (1)
    aaa();
else
    printf("Yo are so wrong\n");

просто не скомпилируется.

 

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this