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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 52, средняя оценка - 4.90
ertyuo
0 / 0 / 0
Регистрация: 05.01.2010
Сообщений: 3
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++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11841 / 6820 / 771
Регистрация: 27.09.2012
Сообщений: 16,911
Записей в блоге: 2
Завершенные тесты: 1
24.10.2015, 22:03     Чем же макрос define так плох? #81
Цитата Сообщение от castaway Посмотреть сообщение
Почему/по какой причине оно может измениться
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <iostream>
 
 
void foo ( const int & x )
{
    const_cast<int&>(x) = 10 ;
}
 
 
 
const int & bar ()
{
    static const volatile int cv = 5 ;
    return const_cast<const int&>(cv) ;
}
 
 
 
int main()
{
    std::cout << bar() << std::endl ;
    foo(bar()) ;
    std::cout << bar() << std::endl ;
}
http://rextester.com/SJSNG36240
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
castaway
Эксперт С++
4848 / 2987 / 368
Регистрация: 10.11.2010
Сообщений: 11,028
Записей в блоге: 10
Завершенные тесты: 1
24.10.2015, 22:09     Чем же макрос define так плох? #82
Я начинаю понимать что вы имеете в виду. Просто меня больше интересовало понятие "неконстантная константа" по канонам языка...
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
#include <cstdio>
 
int main() {
    const int i = 123;
    printf( "%p - %d\n", &i, i );
    int & j = const_cast<int &>( i );
    ++j;
    printf( "%p - %d\n", &j, j );
}


Добавлено через 4 минуты
ValeryS, ну это ты загнул конечно))
Croessmah
24.10.2015, 22:22
  #83

Не по теме:

Цитата Сообщение от castaway Посмотреть сообщение
ну это ты загнул конечно))
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
 
 
 
 
const volatile int & bar ()
{
    static const volatile int cv = 5 ;
    return cv ;
}
 
 
 
int main()
{
    int arr[1] ;
    std::cout << bar() << std::endl ;
    arr[-(arr - &bar())] = 10 ; 
    std::cout << ( arr + -(arr - &bar()) ) << std::endl ;
    std::cout << bar() << std::endl ;
}
http://rextester.com/CPJIK90737
чисто поржать

castaway
24.10.2015, 22:29
  #84

Не по теме:

Croessmah, тебе бы обфускатором работать))

Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
24.10.2015, 22:42     Чем же макрос define так плох? #85
Цитата Сообщение от Croessmah Посмотреть сообщение
C++
1
static const volatile int cv = 5 ;
Только вот при таком определении будет UB при попытке изменить переменную cv. Т.к. volatile подразумевает изменение извне кода (чтобы компилятор не пытался оптимизировать доступ). А убирание константности через const_cast с дальнейшей записью как бы ничем не отличается от случая, если бы volatile не было вовсе. Т.е. попытка записать в константную ячейку.

Не по теме:

Цитата Сообщение от castaway Посмотреть сообщение
тебе бы обфускатором работать))
а ты разве не знал, что Croessmah переводится как Обфускатор?

Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11841 / 6820 / 771
Регистрация: 27.09.2012
Сообщений: 16,911
Записей в блоге: 2
Завершенные тесты: 1
24.10.2015, 22:47     Чем же макрос define так плох? #86

Не по теме:

Цитата Сообщение от Tulosba Посмотреть сообщение
Croessmah переводится как Обфускатор?
croessmah - это уже обфусцированное имя



Добавлено через 35 секунд
Цитата Сообщение от Tulosba Посмотреть сообщение
Только вот при таком определении будет UB
так никто не утверждает обратного.
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
24.10.2015, 22:55     Чем же макрос define так плох? #87
Цитата Сообщение от Croessmah Посмотреть сообщение
так никто не утверждает обратного.
Ну никто из Croessmah'ов и не утверждал не обратного. Или утверждал?

Не по теме:

P.S. Надо в подпись добавить "Если не оговорено обратное, код может содержать UB"

castaway
24.10.2015, 22:56
  #88

Не по теме:

Цитата Сообщение от Tulosba Посмотреть сообщение
P.S. Надо в подпись добавить "Если не оговорено обратное, код может содержать UB"
Такую подпись следует сделать доброй половине форума))

Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11841 / 6820 / 771
Регистрация: 27.09.2012
Сообщений: 16,911
Записей в блоге: 2
Завершенные тесты: 1
24.10.2015, 23:03     Чем же макрос define так плох? #89
Цитата Сообщение от Tulosba Посмотреть сообщение
Ну никто из Croessmah'ов и не утверждал не обратного. Или утверждал?
Не обратного не утверждал, думаю, здесь все посвящены в это и так.
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,053
24.10.2015, 23:06     Чем же макрос define так плох? #90
бяда С(и плюсов) в том что он пытается быть языком высокого уровня и в тоже время разрешает низкоуровневый доступ
и в результате на каждое нововведение ограничивающие программиста, найдется "финт ушами" который это нововведение нивелирует
если есть неконтролируемый доступ к памяти, особенно на архитектуре фон Немана,считай что все ограничения обошли
castaway
Эксперт С++
4848 / 2987 / 368
Регистрация: 10.11.2010
Сообщений: 11,028
Записей в блоге: 10
Завершенные тесты: 1
24.10.2015, 23:16     Чем же макрос define так плох? #91
ValeryS, это не беда плюсов, это беда холиварщиков.
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,053
24.10.2015, 23:20     Чем же макрос define так плох? #92
Цитата Сообщение от castaway Посмотреть сообщение
это беда
Цитата Сообщение от ValeryS Посмотреть сообщение
бяда
видишь как я слово написал что как бы подразумевает
castaway
Эксперт С++
4848 / 2987 / 368
Регистрация: 10.11.2010
Сообщений: 11,028
Записей в блоге: 10
Завершенные тесты: 1
24.10.2015, 23:23     Чем же макрос define так плох? #93
Цитата Сообщение от ValeryS Посмотреть сообщение
видишь как я слово написал что как бы подразумевает
Ну, если читать далее, то как бы не совсем подразумевает...
Tulosba
24.10.2015, 23:26
  #94

Не по теме:

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

castaway
24.10.2015, 23:30
  #95

Не по теме:

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

Не по теме:

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

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

Croessmah
24.10.2015, 23:30
  #96

Не по теме:

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

Tulosba
24.10.2015, 23:32
  #97

Не по теме:

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

Evg
24.10.2015, 23:45
  #98

Не по теме:

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

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

hoggy
5229 / 2120 / 404
Регистрация: 15.11.2014
Сообщений: 4,812
Завершенные тесты: 1
25.10.2015, 12:19     Чем же макрос define так плох? #99
Цитата Сообщение от Tulosba Посмотреть сообщение
Убираем константу:
хех, вы не поняли.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Или воспользуйтесь поиском по форуму:
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16828 / 5249 / 321
Регистрация: 30.03.2009
Сообщений: 14,136
Записей в блоге: 26
25.10.2015, 12:27     Чем же макрос define так плох? #100
Цитата Сообщение от hoggy Посмотреть сообщение
вы можете привести пример хотя бы одного такого случая, когда я веник называл пряником
Словом "константа" называть переменную
Использовать понятие "адрес константы"
Словом "inline" называть пропагирование константного значения
Yandex
Объявления
25.10.2015, 12:27     Чем же макрос define так плох?
Ответ Создать тему

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

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