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

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

08.01.2010, 03:29. Просмотров 8203. Ответов 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?
Дали написать реферат по make файлам и соответственно указать его минусы, а...

Чем плох std::map?
std::map ?

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

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

Перевести макрос define в функцию
Доброго времени суток. Я тут на днях набросал вот такие макросы для удобства:...

Чем оличается define от const
define A 5; и const a = 5; В первом случае идет замена в предпроцессоре......

115
hoggy
Заблокирован
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
:)
Эксперт С++
4746 / 3240 / 496
Регистрация: 19.02.2013
Сообщений: 9,046
25.10.2015, 12:50 #102
Цитата Сообщение от hoggy Посмотреть сообщение
секцию бинарника для кода я не рассматриваю в принципе
Вот жесть, честное слово:
Цитата Сообщение от hoggy Посмотреть сообщение
Цитата Сообщение от Tulosba Посмотреть сообщение
она явно или косвенно попадет в сегмент данных или кода, что повлияет на размер объектного файла.
нет, не попадет.
В таких условиях построить нормальный диалог невозможно.
0
hoggy
Заблокирован
25.10.2015, 12:54 #103
Цитата Сообщение от Tulosba Посмотреть сообщение
Вот жесть, честное слово:
я буду готов рассматривать секцию бинарника,
когда вы сравните версию с дефайном с версией с константой.

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

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

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

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

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


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

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

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

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

Не по теме:

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

0
hoggy
Заблокирован
25.10.2015, 13:22 #105
Цитата Сообщение от Evg Посмотреть сообщение
Понятия не имею. Можно, конечно, оперировать колхозными терминами
а можно почитать стандарт языка с++
0
Tulosba
:)
Эксперт С++
4746 / 3240 / 496
Регистрация: 19.02.2013
Сообщений: 9,046
25.10.2015, 13:23 #106
Цитата Сообщение от hoggy Посмотреть сообщение
ведь то, что вы сейчас постулируете - в этом отсутствует здравый смысл.
Прежде чем отвечать, читай полностью, что тебе пишут. А то складывается впечатление, что ты читаешь половину, потом из того что прочитал ещё половину интерпретируешь своим особенным образом. В итоге делаешь неверные выводы, которые повергают других в шок. И вот тут начинается срач в теме на N бессмысленных сообщений.

Кстати, ссылка-то открылась у тебя хоть какая-то про статический константный член класса, или файервол до сих пор не пускает?
0
hoggy
Заблокирован
25.10.2015, 13:24 #107
Цитата Сообщение от Evg Посмотреть сообщение
Если ты не видишь разницы между "адресом переменной" и "адресом константы", то, видимо, проблем нет
есть шаблон, который принимает адрес чевота, и выводит его в консольку:


C++
1
2
3
4
foo(const auto* p)
{
    std::cout << p <<std::endl;
}
объясните мне (и компилятору), какую такую сакральную разницу мы должны понимать?

Добавлено через 29 секунд
Цитата Сообщение от Evg Посмотреть сообщение
Знаком
какие тогда у вас сложности с пониманием материала?
0
Evg
Эксперт CАвтор FAQ
18938 / 6899 / 513
Регистрация: 30.03.2009
Сообщений: 19,441
Записей в блоге: 30
25.10.2015, 13:26 #108
Цитата Сообщение от hoggy Посмотреть сообщение
какую такую сакральную разницу мы должны понимать?
Например, такую, что первый код будет работать, а второй нет

C++
const int a = 10;
foo (&a);
C++
foo (&10);
0
hoggy
Заблокирован
25.10.2015, 13:27 #109
Цитата Сообщение от Tulosba Посмотреть сообщение
Прежде чем отвечать, читай полностью, что тебе пишут. А то складывается впечатление, что ты читаешь половину,
вы в своем коде (см #61)

в одном случае выводите константу.
а в другом вообще её не выводите.

задайте себе вопрос: нахрена вы сделали такой тест?
как это соотносится с темой "дефайны против констант"?
0
Evg
Эксперт CАвтор FAQ
18938 / 6899 / 513
Регистрация: 30.03.2009
Сообщений: 19,441
Записей в блоге: 30
25.10.2015, 13:27 #110
Цитата Сообщение от hoggy Посмотреть сообщение
какие тогда у вас сложности с пониманием материала?
Смысл слова "inline" я объяснил выше
0
hoggy
Заблокирован
25.10.2015, 13:31 #111
Цитата Сообщение от Evg Посмотреть сообщение
Например, такую, что первый код будет работать, а второй нет
и какое это имеет отношение к функции foo?

ей то какая разница?

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

так что разницы не будет.

можете глянуть ассмо-выхлоп.

http://rextester.com/EOQ15501

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
 
 
void bar(auto&& )
{
    std::cout<< "ololo\n";
}
 
 
void foo(auto&& p)
{
    bar(&p);
}
 
 
 
int main()
{
    std::cout << "Hello, world!\n";
    
    foo(10);
}
0
Tulosba
:)
Эксперт С++
4746 / 3240 / 496
Регистрация: 19.02.2013
Сообщений: 9,046
25.10.2015, 13:32 #112
Цитата Сообщение от hoggy Посмотреть сообщение
нахрена вы сделали такой тест?
Для тебя же и сделал, потому что ты ответил, что значение НИКУДА не попадает.
Цитата Сообщение от hoggy Посмотреть сообщение
как это соотносится с темой "дефайны против констант"?
Название темы "Чем же макрос define так плох?", снова ты додумываешь того, чего нет.
0
hoggy
Заблокирован
25.10.2015, 13:39 #113
Цитата Сообщение от Tulosba Посмотреть сообщение
Для тебя же и сделал, потому что ты ответил, что значение НИКУДА не попадает.
я мыслю в контексте темы.
то бишь, понятно что попадает, но не более и не менее, чем в случае с дефайнами.
потому что компилятор не телепат.

однако,
константы, у которых не просили адреса, не кушают оперативную память.

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

Добавлено через 1 минуту
Цитата Сообщение от Tulosba Посмотреть сообщение
Название темы "Чем же макрос define так плох?", снова ты додумываешь того, чего нет.
там человечек выше писал, мол они жрут память.

я наглядно опровергаю этот тезис.

демонстрируя, что дефайны не имеют никаких приимуществ перед константами в этом смысле.
0
Tulosba
:)
Эксперт С++
4746 / 3240 / 496
Регистрация: 19.02.2013
Сообщений: 9,046
25.10.2015, 13:49 #114
Цитата Сообщение от hoggy Посмотреть сообщение
я мыслю в контексте темы.
Оно и видно, ещё бы не плохо научиться читать, что внутри темы написано.
Цитата Сообщение от hoggy Посмотреть сообщение
в каком контексте мыслите вы?
В контексте конкретных сообщений внутри конкретной темы.
0
hoggy
Заблокирован
25.10.2015, 13:54 #115
Цитата Сообщение от Tulosba Посмотреть сообщение
Оно и видно, ещё бы не плохо научиться читать, что внутри темы написано.
краеугольный камень данной темы: приимущества дефайнов против констант.
хотите сказать, что я неверно истолковал мотив автора?

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

ваш тест никак не соотносится с изучаемой проблемой.
0
Croessmah
++Ͻ
14161 / 8086 / 1513
Регистрация: 27.09.2012
Сообщений: 19,926
Записей в блоге: 3
Завершенные тесты: 1
25.10.2015, 19:53 #116
Герб Саттер, "Новые сложные задачи на C++".
Не по теме, просто пусть будет здесь
Чем же макрос define так плох?
1
25.10.2015, 19:53
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.10.2015, 19:53
Привет! Вот еще темы с решениями:

#define работает не так, как ожидается
Здравствуйте. Подскажите, пожалуйста, почему в таком случае некорректно...

#define sqr(a) (a)*(a) - зачем так много скобок?
#define sqr(a) ((a)*(a)) такие вопросы: 1) Зачем ((a)*(a)) так много...

Объясните, в чем суть директив #ifndef/#define/#endif
Не понял в чем суть директив: #ifndef .. #define.. #endifОбъясните...

Что это за макрос? И с чем его едят?
Есть две строки. С первой вроде разобрался, поправьте если не совсем. Из книги...


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

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

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