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

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


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

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



Цитата(igorle @ Sep 28 2013, 12:08) *
Такой результат получится с любым исправным компилятором. Если есть под рукой GCC - посмотрите результат препроцессора. У меня под рукой нет. Поэтому сделаем препроцессинг вручную.
Код
if (0)
    if (1)
      ; { printf("Good style saves you\n"); };

Насчет GCC не скажу, но в Keil C-99 точка с запятой не отрывается от имени макрофункции.
Go to the top of the page
 
+Quote Post
Ruslan1
сообщение Sep 28 2013, 11:08
Сообщение #32


Гуру
******

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



Цитата(igorle @ Sep 28 2013, 12:22) *
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
Flood
сообщение Sep 28 2013, 11:50
Сообщение #33


Знающий
****

Группа: Свой
Сообщений: 702
Регистрация: 8-06-06
Пользователь №: 17 871



Цитата(Ruslan1 @ Sep 28 2013, 15:08) *
Это не интересно. Я спросил пример кода, где определенный так макрос будет работать некорректно.
То есть когда оно работает, но некорректно.


К чему такие придирки? Или если написано "чуть-чуть неправильно" - то так делать можно, а вот если "совсем неправильно" - уже нельзя?

Очевидно, что простой блок в макросах способен вызвать проблемы, знать об этом и осознанно писать проблемные макросы - как минимум странно. С точки зрения повторного использования будет не важно, код не компилируется, или компилируется, но работает некорректно. Это влияет только на скорость выявления проблем. Все равно придется лезть в чужой (или в свой старый) макрос и его исправлять, или переписывать код так, чтобы после макроса не было точки с запятой.
И зачем это нужно, если есть старый как сам C способ написания корректного кода?
http://c-faq.com/cpp/multistmt.html

О нем можно не знать, это нормально. Но знать и не использовать - в чем выгода?
Go to the top of the page
 
+Quote Post
igorle
сообщение Sep 28 2013, 15:38
Сообщение #34


Местный
***

Группа: Свой
Сообщений: 338
Регистрация: 14-07-12
Пользователь №: 72 753



Поддерживаю предыдущего оратора.

И еще.
"функции" без точки с запятой в конце, сбивают механизм автоматической индентации. Например, я сейчас напечатал в виме код, и он выровнял мне его так:
Код
if (1)
    aaa()
        bbb();

А это некрасиво. И это уже достаточный повод не делать этого.
Go to the top of the page
 
+Quote Post
ViKo
сообщение Sep 29 2013, 19:01
Сообщение #35


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

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



Цитата(igorle @ Sep 28 2013, 18:38) *
Например, я сейчас напечатал в виме код, и он выровнял мне его так:

Что такое "вим"?
Go to the top of the page
 
+Quote Post
Flood
сообщение Sep 29 2013, 20:03
Сообщение #36


Знающий
****

Группа: Свой
Сообщений: 702
Регистрация: 8-06-06
Пользователь №: 17 871



Цитата(ViKo @ Sep 29 2013, 23:01) *
Что такое "вим"?

Адский текстовый редактор. (Самый?) мощный, но по-настоящему красноглазый.
http://ru.wikipedia.org/wiki/Vim
Go to the top of the page
 
+Quote Post
A. Fig Lee
сообщение Sep 29 2013, 20:22
Сообщение #37


Знающий
****

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



Цитата(igorle @ Sep 28 2013, 05:22) *
А вывод один - обрамляйте любую макрофункцию, состоящую более чем из вызова одной функции, do {} while(0), и будет вам счастье.


Не согласен.
После if всегда надо пользовать фигурные скобки.
Назвисимо от использования всяких define.
Это улучшает читаемость и предсказуемость кода.
Чем больше напихано в #define, тем сложнее их читать.

То, что компилятор не скомпилирует не проблема.
поправим. Проблема если скомпилирует не так как надо.


--------------------
Верить нельзя никому, даже себе. Мне - можно.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Sep 29 2013, 20:56
Сообщение #38


Гуру
******

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



Цитата(A. Fig Lee @ Sep 30 2013, 00:22) *
После if всегда надо пользовать фигурные скобки.
...
Это улучшает читаемость и предсказуемость кода.

Код
if(x) zzz();

По-моему, в подобном выражении фигурные скобки не улучшат читаемость. Скорее, наоборот.

Цитата(A. Fig Lee @ Sep 30 2013, 00:22) *
То, что компилятор не скомпилирует не проблема.
поправим. Проблема если скомпилирует не так как надо.

Если что-то надо править, то это все равно проблема. Она, конечно, меркнет на фоне второго варианта развития событий, но все же.
Go to the top of the page
 
+Quote Post
ig_z
сообщение Sep 29 2013, 21:16
Сообщение #39


Местный
***

Группа: Свой
Сообщений: 437
Регистрация: 27-08-04
Пользователь №: 551



QUOTE (A. Fig Lee @ Sep 29 2013, 23:22) *
Не согласен.
После if всегда надо пользовать фигурные скобки.
Назвисимо от использования всяких define.
Это улучшает читаемость и предсказуемость кода.
Чем больше напихано в #define, тем сложнее их читать.

То, что компилятор не скомпилирует не проблема.
поправим. Проблема если скомпилирует не так как надо.

Маладец! Герой! Аплодирую стоя, один прет против всех! Прям как макаревич в своих нетленках.
Теперь нужно срочно наставить на путь истинный девелоперов линукс ядра, lwip, contiki и т.д. Залезть в их репозитории и поубивать ненавистные дувайлы sm.gif
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 - 10:21
Рейтинг@Mail.ru


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