Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 52, средняя оценка - 4.90
ertyuo
0 / 0 / 0
Регистрация: 05.01.2010
Сообщений: 9
#1

Чем же макрос define так плох? - C++

08.01.2010, 03:29. Просмотров 7771. Ответов 115

После прочтения про директиву препроцессора define возник вопрос по поводу применения define, как функции:
C++
1
#define QQ (q) (q^q)
Можно же улучшить читаемость кода, используя вместо функций именно директиву define. Или у данного использования макроса есть подводные камки какие-то? Да и объем кода в разы сократиться, так как для define будет достаточно всего-навсего одной строчки.
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.01.2010, 03:29
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Чем же макрос define так плох? (C++):

Чем плох make? - C++
Дали написать реферат по make файлам и соответственно указать его минусы, а значит сравнить его с такими утилитами как CMake, но для меня...

Чем плох std::map? - C++
std::map ?

Чем плох void main? - C++
Встретил мнение, что void main() - не канон и даже плохо. Но статья древняя, 1996 года, и даже автор открестился, сказав, что для новых...

Чем плох управляемый С++? - C++
Я дико извиняюсь за подобную тему... но дело в том, что мне сегодня задали этот вопрос и, собственно, я не смог на него ответить. Сам я...

Перевести макрос define в функцию - C++
Доброго времени суток. Я тут на днях набросал вот такие макросы для удобства: #define BinSave(Value, Root)\ //Переменная, путь к...

Чем оличается define от const - C++
define A 5; и const a = 5; В первом случае идет замена в предпроцессоре... а во втором? и еще слышал что define оч редко стал...

115
castaway
Эксперт С++
4920 / 3028 / 372
Регистрация: 10.11.2010
Сообщений: 11,085
Записей в блоге: 10
Завершенные тесты: 1
24.10.2015, 23:16 #91
ValeryS, это не беда плюсов, это беда холиварщиков.
3
ValeryS
Модератор
6785 / 5193 / 497
Регистрация: 14.02.2011
Сообщений: 17,431
24.10.2015, 23:20 #92
Цитата Сообщение от castaway Посмотреть сообщение
это беда
Цитата Сообщение от ValeryS Посмотреть сообщение
бяда
видишь как я слово написал что как бы подразумевает
0
castaway
Эксперт С++
4920 / 3028 / 372
Регистрация: 10.11.2010
Сообщений: 11,085
Записей в блоге: 10
Завершенные тесты: 1
24.10.2015, 23:23 #93
Цитата Сообщение от ValeryS Посмотреть сообщение
видишь как я слово написал что как бы подразумевает
Ну, если читать далее, то как бы не совсем подразумевает...
0
Tulosba
24.10.2015, 23:26
  #94

Не по теме:

Так вот подумал сейчас, что тему надо вообще на N разбить:
1. Исходная
2. Занимают ли память константы
3. Могут ли константы быть переменными
4. Почему Croessmah обфусцирован
5. В чем отличие бяды Си(++) от беды Си(++)
и т.д.

0
castaway
24.10.2015, 23:30
  #95

Не по теме:

Tulosba, ты чертовски прав, приятель

Не по теме:

Цитата Сообщение от Tulosba Посмотреть сообщение
4. Почему Croessmah обфусцирован

))))))))))))))))))))))))))))))))))))...))))))))))

0
Croessmah
24.10.2015, 23:30
  #96

Не по теме:

Цитата Сообщение от Tulosba Посмотреть сообщение
Так вот подумал сейчас, что тему надо вообще на N разбить:
как по мне, так пора просто её закрыть. Вроде всё уже сказали
Цитата Сообщение от Tulosba Посмотреть сообщение
4. Почему Croessmah обфусцирован
это одна из величайших нерешенных задач современности. Обсуждение сего предмета - большой холивар и прямой путь в психушку

0
Tulosba
24.10.2015, 23:32
  #97

Не по теме:

Цитата Сообщение от Croessmah Посмотреть сообщение
Вроде всё уже сказали
hoggy ещё не высказался по ссылкам, которые, надеюсь всё же у него откроются.

0
Evg
24.10.2015, 23:45
  #98

Не по теме:

Словом "inline" называют подстановку тела функции в точку её вызова, а не подстановку значения const-переменной в точку её обращения (это уже constant propagation или что-то типа того)

const - НЕ означает "константный", а означает "немодифицируемый". Ссылка на всякий случай: [Задача] const volatile

0
hoggy
6798 / 2984 / 514
Регистрация: 15.11.2014
Сообщений: 6,742
Завершенные тесты: 1
25.10.2015, 12:19 #99
Цитата Сообщение от Tulosba Посмотреть сообщение
Убираем константу:
хех, вы не поняли.

"убрать константу" в данном случае значит заменить её не константой.

а не убрать целиком и полностью.

понятно, что если мы физически вырежим код,
то и в бинарник тоже меньше будет попадать.
но речь жеж не об этом.

Цитата Сообщение от Tulosba Посмотреть сообщение
Как вообще можно было предположить, что значение явно присутствующее в исходном файле, может выводиться на консоль и при этом НИГДЕ не храниться?
когда я выше писал:
компилятор значения констант inline подстановками профигачит.

вы это так и поняли? что он константу физически вырезает.
а потом из астрала читает?

----------------------------------------

в памяти не хранится.

(секцию бинарника для кода я не рассматриваю в принципе)

Добавлено через 5 минут
Цитата Сообщение от Evg Посмотреть сообщение
"Пример выше" это который?
см #43.
Цитата Сообщение от Evg Посмотреть сообщение
Из этого никак не следует, что const-переменная является константой
это не принципиально.
const-переменная является константой просто потому,
что у неё такой квалификатор.

при этом она может и не быть константой времени компиляции.
но это так же не принципиально.

потому что
все топовые компиляторы уже давным давно
научились оптимизировать промежуточные значения.

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

вы можете привести пример хотя бы одного такого случая, когда я веник называл пряником.
потому что сейчас ваши речи - ложь и клевета.
0
Evg
Эксперт CАвтор FAQ
18689 / 6654 / 469
Регистрация: 30.03.2009
Сообщений: 18,624
Записей в блоге: 29
25.10.2015, 12:27 #100
Цитата Сообщение от hoggy Посмотреть сообщение
вы можете привести пример хотя бы одного такого случая, когда я веник называл пряником
Словом "константа" называть переменную
Использовать понятие "адрес константы"
Словом "inline" называть пропагирование константного значения
0
hoggy
6798 / 2984 / 514
Регистрация: 15.11.2014
Сообщений: 6,742
Завершенные тесты: 1
25.10.2015, 12:34 #101
Цитата Сообщение от castaway Посмотреть сообщение
const-переменная? Я не ослышался?
нет, не ослышались.

в программировании переменные могут быть константными.
как бы ни странно это звучало.

однако,
тема дефайнов как альтернатива константам подразумевает константы времени компиляции.
а вот эти константы уже не могут быть переменными.

так что да, ваше замечание попало в цель.

Добавлено через 6 минут
Цитата Сообщение от Evg Посмотреть сообщение
Словом "константа" называть переменную
на языке с++ есть три группы объектов наделенных квалификатором const:

1.
константы времени компиляции
2.
константы времени выполнения
3.
mutable переменные.

только и только константы времени компиляции не являются переменными.

хотите сказать, что я это придумал?

Цитата Сообщение от Evg Посмотреть сообщение
Использовать понятие "адрес константы"
C++
1
2
const int v = 10;
const int* p = &v;
какие то проблемы?

Цитата Сообщение от Evg Посмотреть сообщение
Словом "inline" называть пропагирование константного значения
мне не знаком термин "пропагирование"

вам знаком термин "inline подстановка"?
вы понимаете, что это значит?
0
Tulosba
:)
Эксперт С++
4619 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
25.10.2015, 12:50 #102
Цитата Сообщение от hoggy Посмотреть сообщение
секцию бинарника для кода я не рассматриваю в принципе
Вот жесть, честное слово:
Цитата Сообщение от hoggy Посмотреть сообщение
Цитата Сообщение от Tulosba Посмотреть сообщение
она явно или косвенно попадет в сегмент данных или кода, что повлияет на размер объектного файла.
нет, не попадет.
В таких условиях построить нормальный диалог невозможно.
0
hoggy
6798 / 2984 / 514
Регистрация: 15.11.2014
Сообщений: 6,742
Завершенные тесты: 1
25.10.2015, 12:54 #103
Цитата Сообщение от Tulosba Посмотреть сообщение
Вот жесть, честное слово:
я буду готов рассматривать секцию бинарника,
когда вы сравните версию с дефайном с версией с константой.

а не когда вы тупо удалили код и сказали: о боже! размер изменился!

мы же рассматриваем различные подходы для одного и того же действия.

выведите мнек цыферку 45 при помощи макроса, или при помощи константы.

но не нужно полностью удалять эту циферку,
и потом кричать: "размер изменился!"

Цитата Сообщение от Tulosba Посмотреть сообщение
В таких условиях построить нормальный диалог невозможно.
разумеется.


ведь то, что вы сейчас постулируете - в этом отсутствует здравый смысл.
0
Evg
Эксперт CАвтор FAQ
18689 / 6654 / 469
Регистрация: 30.03.2009
Сообщений: 18,624
Записей в блоге: 29
25.10.2015, 13:19 #104
Цитата Сообщение от hoggy Посмотреть сообщение
хотите сказать, что я это придумал?
Понятия не имею. Можно, конечно, оперировать колхозными терминами, называть системный блок словом "процессор" или называть internet explorer словом "интернет". Всё зависит от того, насколько визави готов к колхозным терминам

Цитата Сообщение от hoggy Посмотреть сообщение
какие то проблемы?
Если ты не видишь разницы между "адресом переменной" и "адресом константы", то, видимо, проблем нет

Цитата Сообщение от hoggy Посмотреть сообщение
вам знаком термин "inline подстановка"?
Знаком

Цитата Сообщение от hoggy Посмотреть сообщение
вы понимаете, что это значит?
Понимаю

Не по теме:

Тема превратилась в очередной срач

0
hoggy
6798 / 2984 / 514
Регистрация: 15.11.2014
Сообщений: 6,742
Завершенные тесты: 1
25.10.2015, 13:22 #105
Цитата Сообщение от Evg Посмотреть сообщение
Понятия не имею. Можно, конечно, оперировать колхозными терминами
а можно почитать стандарт языка с++
0
25.10.2015, 13:22
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.10.2015, 13:22
Привет! Вот еще темы с ответами:

#define работает не так, как ожидается - C++
Здравствуйте. Подскажите, пожалуйста, почему в таком случае некорректно использовать #define: switch (kind) { case 1: ...

#define sqr(a) (a)*(a) - зачем так много скобок? - C++
#define sqr(a) ((a)*(a)) такие вопросы: 1) Зачем ((a)*(a)) так много скобок? (если можно,объяснить доступным языком) 2) почему,...

Объясните, в чем суть директив #ifndef/#define/#endif - C++
Не понял в чем суть директив: #ifndef .. #define.. #endifОбъясните пожалуйста..это как - то связано с хедерами, но вот как ??

Что это за макрос? И с чем его едят? - C++
Есть две строки. С первой вроде разобрался, поправьте если не совсем. Из книги Лафоре ООП (реализация консольной графики). #ifndef...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
105
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru