ViKo 1 27 сентября, 2013 Опубликовано 27 сентября, 2013 · Жалоба Т.е. теперь БОЛЬШИЕ_БУКВЫ всегда оборачивать в {} безопасности для? Зачем писать нарочито плохо, если можно без каких бы то ни было усилий написать хорошо и правильно? На мой взгляд, макрос в виде функции выглядит логичнее, чем конструкция с довеском do ... while(0) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 63 27 сентября, 2013 Опубликовано 27 сентября, 2013 · Жалоба "Логичнее"? А что ведет себя совсем иначе - это ничего? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 27 сентября, 2013 Опубликовано 27 сентября, 2013 · Жалоба Т.е. теперь БОЛЬШИЕ_БУКВЫ всегда оборачивать в {} безопасности для? Не всегда. Только функции БОЛЬШИЕ_БУКВЫ(); КОНСТАНТЫ - не нужно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 63 27 сентября, 2013 Опубликовано 27 сентября, 2013 · Жалоба Не всегда. Только функции БОЛЬШИЕ_БУКВЫ(); КОНСТАНТЫ - не нужно. Правильно, константы я бы в таком коде превинтивно заворачивал в (). Во избежание. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 27 сентября, 2013 Опубликовано 27 сентября, 2013 · Жалоба "Логичнее"? А что ведет себя совсем иначе - это ничего? Ведет себя, именно, как функция. Набор выражений. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 63 27 сентября, 2013 Опубликовано 27 сентября, 2013 · Жалоба Этот "набор выражений" и ведет себя как набор не связанных друг с другом выражений, а не как функция. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 27 сентября, 2013 Опубликовано 27 сентября, 2013 · Жалоба Этот "набор выражений" и ведет себя как набор не связанных друг с другом выражений, а не как функция. Да ну? Отличие только в том, что ничего не возвращает (всегда). Тот пример, что я показал, запросто можно оформить в виде функции. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 63 27 сентября, 2013 Опубликовано 27 сентября, 2013 · Жалоба Да ну? Отличие только в том, что ничего не возвращает (всегда). Тот пример, что я показал, запросто можно оформить в виде функции. Понятно, в виде функции - это "#define MACRO {}"? Немного получше, но все равно не то. А уж этому - #define WDELAY_RESTART(); \ TIM7->EGR = TIM_EGR_UG; \ TIM7->SR = 0; \ TIM7->CR1 |= TIM_CR1_CEN; - точно не место в ветке для начинающих. Разве что как пример того, как делать не следует никогда. Примерно такой же "полезности" макрос: #define 10 5 + 5 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
A. Fig Lee 0 28 сентября, 2013 Опубликовано 28 сентября, 2013 · Жалоба и обязательно в скобках do{}while(0) Это уже "на все случаи жизни". И так хорошо. ИМХО. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Raven 8 28 сентября, 2013 Опубликовано 28 сентября, 2013 · Жалоба и обязательно в скобках do{}while(0) Спасибо за интересный прием. Действительно полезно для макросов. Возьму на вооружение. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 28 сентября, 2013 Опубликовано 28 сентября, 2013 · Жалоба Понятно, в виде функции - это "#define MACRO {}"? Немного получше, но все равно не то. Хорошо, добавим фигурные скобки. Можете привести пример, когда такая конструкция будет работать неправильно? #define WDELAY_RESTART(); { \ TIM7->EGR = TIM_EGR_UG; \ TIM7->SR = 0; \ TIM7->CR1 |= TIM_CR1_CEN; \ } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
igorle 0 28 сентября, 2013 Опубликовано 28 сентября, 2013 (изменено) · Жалоба Хорошо, добавим фигурные скобки. Можете привести пример, когда такая конструкция будет работать неправильно? #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; } Изменено 28 сентября, 2013 пользователем igorle Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 28 сентября, 2013 Опубликовано 28 сентября, 2013 · Жалоба Будет напечатано сообщение? Проверьте Точка с запятой стоит намеренно. Но я, хоть убей не понимаю поведения codepad! Подставляю ту же строку из макро - и не печатает! (первый пример) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Ruslan1 14 28 сентября, 2013 Опубликовано 28 сентября, 2013 · Жалоба Прочитал все написанное но так и не понял почему так все сложно. И я совершенно не представляю ситуацию когда не будет работать конструкция #define MacroName(параметры_если_есть) \ { /*комментарий0 если нужен */ \ оператор1; /*комментарий1 если нужен */ \ оператор2; /*комментарий2 если нужен */ \ } Будьте добры, приведите мне любой пример кода, где определенный так макрос будет работать некорректно. Неужто кто-то знает такая комбинацию компилятора, параметров и операторов, когда это будет работать иначе чем задумано программистом при написании этого макроса? Пока что я пребываю в дремучем незнании и полной уверенности что оно работает, буду рад любому кто раскроет мне глаза на подлую сущность вещей. Как говориться, "thanks in advance". Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
igorle 0 28 сентября, 2013 Опубликовано 28 сентября, 2013 · Жалоба Точка с запятой стоит намеренно. Но я, хоть убей не понимаю поведения 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"); просто не скомпилируется. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться