Перейти к содержанию

    

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

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

 

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

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

Поделиться сообщением


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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Не всегда. Только функции БОЛЬШИЕ_БУКВЫ();

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
"Логичнее"? А что ведет себя совсем иначе - это ничего?

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


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

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

Поделиться сообщением


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

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

 

А уж этому -

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

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

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

#define  10   5 + 5

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
и обязательно в скобках do{}while(0)

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

И так хорошо.

ИМХО.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
и обязательно в скобках do{}while(0)

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

Поделиться сообщением


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

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

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

Поделиться сообщением


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

#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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Будет напечатано сообщение? Проверьте

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

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

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Точка с запятой стоит намеренно. Но я, хоть убей не понимаю поведения 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");

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
Авторизация