Форум программистов, компьютерный форум CyberForum.ru

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

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

Объясните, в чем суть директив #ifndef/#define/#endif C++
C++ Чем оличается define от const
Чем плох C++
C++ В чем ошибка? что не так?
#define работает не так, как ожидается C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
hoggy
5230 / 2121 / 404
Регистрация: 15.11.2014
Сообщений: 4,812
Завершенные тесты: 1
25.10.2015, 12:34     Чем же макрос define так плох? #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 подстановка"?
вы понимаете, что это значит?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
25.10.2015, 12:50     Чем же макрос define так плох? #102
Цитата Сообщение от hoggy Посмотреть сообщение
секцию бинарника для кода я не рассматриваю в принципе
Вот жесть, честное слово:
Цитата Сообщение от hoggy Посмотреть сообщение
Цитата Сообщение от Tulosba Посмотреть сообщение
она явно или косвенно попадет в сегмент данных или кода, что повлияет на размер объектного файла.
нет, не попадет.
В таких условиях построить нормальный диалог невозможно.
hoggy
5230 / 2121 / 404
Регистрация: 15.11.2014
Сообщений: 4,812
Завершенные тесты: 1
25.10.2015, 12:54     Чем же макрос define так плох? #103
Цитата Сообщение от Tulosba Посмотреть сообщение
Вот жесть, честное слово:
я буду готов рассматривать секцию бинарника,
когда вы сравните версию с дефайном с версией с константой.

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

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

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

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

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


ведь то, что вы сейчас постулируете - в этом отсутствует здравый смысл.
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16842 / 5263 / 323
Регистрация: 30.03.2009
Сообщений: 14,159
Записей в блоге: 26
25.10.2015, 13:19     Чем же макрос define так плох? #104
Цитата Сообщение от hoggy Посмотреть сообщение
хотите сказать, что я это придумал?
Понятия не имею. Можно, конечно, оперировать колхозными терминами, называть системный блок словом "процессор" или называть internet explorer словом "интернет". Всё зависит от того, насколько визави готов к колхозным терминам

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

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

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

Не по теме:

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

hoggy
5230 / 2121 / 404
Регистрация: 15.11.2014
Сообщений: 4,812
Завершенные тесты: 1
25.10.2015, 13:22     Чем же макрос define так плох? #105
Цитата Сообщение от Evg Посмотреть сообщение
Понятия не имею. Можно, конечно, оперировать колхозными терминами
а можно почитать стандарт языка с++
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
25.10.2015, 13:23     Чем же макрос define так плох? #106
Цитата Сообщение от hoggy Посмотреть сообщение
ведь то, что вы сейчас постулируете - в этом отсутствует здравый смысл.
Прежде чем отвечать, читай полностью, что тебе пишут. А то складывается впечатление, что ты читаешь половину, потом из того что прочитал ещё половину интерпретируешь своим особенным образом. В итоге делаешь неверные выводы, которые повергают других в шок. И вот тут начинается срач в теме на N бессмысленных сообщений.

Кстати, ссылка-то открылась у тебя хоть какая-то про статический константный член класса, или файервол до сих пор не пускает?
hoggy
5230 / 2121 / 404
Регистрация: 15.11.2014
Сообщений: 4,812
Завершенные тесты: 1
25.10.2015, 13:24     Чем же макрос define так плох? #107
Цитата Сообщение от Evg Посмотреть сообщение
Если ты не видишь разницы между "адресом переменной" и "адресом константы", то, видимо, проблем нет
есть шаблон, который принимает адрес чевота, и выводит его в консольку:


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

Добавлено через 29 секунд
Цитата Сообщение от Evg Посмотреть сообщение
Знаком
какие тогда у вас сложности с пониманием материала?
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16842 / 5263 / 323
Регистрация: 30.03.2009
Сообщений: 14,159
Записей в блоге: 26
25.10.2015, 13:26     Чем же макрос define так плох? #108
Цитата Сообщение от hoggy Посмотреть сообщение
какую такую сакральную разницу мы должны понимать?
Например, такую, что первый код будет работать, а второй нет

C++
const int a = 10;
foo (&a);
C++
foo (&10);
hoggy
5230 / 2121 / 404
Регистрация: 15.11.2014
Сообщений: 4,812
Завершенные тесты: 1
25.10.2015, 13:27     Чем же макрос define так плох? #109
Цитата Сообщение от Tulosba Посмотреть сообщение
Прежде чем отвечать, читай полностью, что тебе пишут. А то складывается впечатление, что ты читаешь половину,
вы в своем коде (см #61)

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

задайте себе вопрос: нахрена вы сделали такой тест?
как это соотносится с темой "дефайны против констант"?
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16842 / 5263 / 323
Регистрация: 30.03.2009
Сообщений: 14,159
Записей в блоге: 26
25.10.2015, 13:27     Чем же макрос define так плох? #110
Цитата Сообщение от hoggy Посмотреть сообщение
какие тогда у вас сложности с пониманием материала?
Смысл слова "inline" я объяснил выше
hoggy
5230 / 2121 / 404
Регистрация: 15.11.2014
Сообщений: 4,812
Завершенные тесты: 1
25.10.2015, 13:31     Чем же макрос define так плох? #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);
}
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
25.10.2015, 13:32     Чем же макрос define так плох? #112
Цитата Сообщение от hoggy Посмотреть сообщение
нахрена вы сделали такой тест?
Для тебя же и сделал, потому что ты ответил, что значение НИКУДА не попадает.
Цитата Сообщение от hoggy Посмотреть сообщение
как это соотносится с темой "дефайны против констант"?
Название темы "Чем же макрос define так плох?", снова ты додумываешь того, чего нет.
hoggy
5230 / 2121 / 404
Регистрация: 15.11.2014
Сообщений: 4,812
Завершенные тесты: 1
25.10.2015, 13:39     Чем же макрос define так плох? #113
Цитата Сообщение от Tulosba Посмотреть сообщение
Для тебя же и сделал, потому что ты ответил, что значение НИКУДА не попадает.
я мыслю в контексте темы.
то бишь, понятно что попадает, но не более и не менее, чем в случае с дефайнами.
потому что компилятор не телепат.

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

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

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

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

демонстрируя, что дефайны не имеют никаких приимуществ перед константами в этом смысле.
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
25.10.2015, 13:49     Чем же макрос define так плох? #114
Цитата Сообщение от hoggy Посмотреть сообщение
я мыслю в контексте темы.
Оно и видно, ещё бы не плохо научиться читать, что внутри темы написано.
Цитата Сообщение от hoggy Посмотреть сообщение
в каком контексте мыслите вы?
В контексте конкретных сообщений внутри конкретной темы.
hoggy
5230 / 2121 / 404
Регистрация: 15.11.2014
Сообщений: 4,812
Завершенные тесты: 1
25.10.2015, 13:54     Чем же макрос define так плох? #115
Цитата Сообщение от Tulosba Посмотреть сообщение
Оно и видно, ещё бы не плохо научиться читать, что внутри темы написано.
краеугольный камень данной темы: приимущества дефайнов против констант.
хотите сказать, что я неверно истолковал мотив автора?

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

ваш тест никак не соотносится с изучаемой проблемой.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.10.2015, 19:53     Чем же макрос define так плох?
Еще ссылки по теме:

C++ Палиндромы. Плох ли мой код?
Чем так отличается язык с++ от других языков программирования C++
C++ #define sqr(a) (a)*(a) - зачем так много скобок?

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

Или воспользуйтесь поиском по форуму:
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11845 / 6824 / 771
Регистрация: 27.09.2012
Сообщений: 16,919
Записей в блоге: 2
Завершенные тесты: 1
25.10.2015, 19:53     Чем же макрос define так плох? #116
Герб Саттер, "Новые сложные задачи на C++".
Не по теме, просто пусть будет здесь
Чем же макрос define так плох?
Yandex
Объявления
25.10.2015, 19:53     Чем же макрос define так плох?
Ответ Создать тему

Метки
#define
Опции темы

Текущее время: 18:20. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru