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

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

08.01.2010, 03:29. Просмотров 8370. Ответов 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
Ответы с готовыми решениями:

Чем плох make?
Дали написать реферат по make файлам и соответственно указать его минусы, а...

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

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

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

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

115
Croessmah
++Ͻ
14500 / 8282 / 1556
Регистрация: 27.09.2012
Сообщений: 20,334
Записей в блоге: 3
Завершенные тесты: 1
24.10.2015, 22:03 #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
1
castaway
Эксперт С++
4929 / 3036 / 453
Регистрация: 10.11.2010
Сообщений: 11,116
Записей в блоге: 10
Завершенные тесты: 1
24.10.2015, 22:09 #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, ну это ты загнул конечно))
0
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
чисто поржать :D

0
castaway
24.10.2015, 22:29
  #84

Не по теме:

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

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

Не по теме:

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

1
Croessmah
++Ͻ
14500 / 8282 / 1556
Регистрация: 27.09.2012
Сообщений: 20,334
Записей в блоге: 3
Завершенные тесты: 1
24.10.2015, 22:47 #86

Не по теме:

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



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

Не по теме:

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

0
castaway
24.10.2015, 22:56
  #88

Не по теме:

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

0
Croessmah
++Ͻ
14500 / 8282 / 1556
Регистрация: 27.09.2012
Сообщений: 20,334
Записей в блоге: 3
Завершенные тесты: 1
24.10.2015, 23:03 #89
Цитата Сообщение от Tulosba Посмотреть сообщение
Ну никто из Croessmah'ов и не утверждал не обратного. Или утверждал?
Не обратного не утверждал, думаю, здесь все посвящены в это и так.
0
ValeryS
Модератор
7215 / 5478 / 682
Регистрация: 14.02.2011
Сообщений: 18,530
24.10.2015, 23:06 #90
бяда С(и плюсов) в том что он пытается быть языком высокого уровня и в тоже время разрешает низкоуровневый доступ
и в результате на каждое нововведение ограничивающие программиста, найдется "финт ушами" который это нововведение нивелирует
если есть неконтролируемый доступ к памяти, особенно на архитектуре фон Немана,считай что все ограничения обошли
0
castaway
Эксперт С++
4929 / 3036 / 453
Регистрация: 10.11.2010
Сообщений: 11,116
Записей в блоге: 10
Завершенные тесты: 1
24.10.2015, 23:16 #91
ValeryS, это не беда плюсов, это беда холиварщиков.
3
ValeryS
Модератор
7215 / 5478 / 682
Регистрация: 14.02.2011
Сообщений: 18,530
24.10.2015, 23:20 #92
Цитата Сообщение от castaway Посмотреть сообщение
это беда
Цитата Сообщение от ValeryS Посмотреть сообщение
бяда
видишь как я слово написал что как бы подразумевает
0
castaway
Эксперт С++
4929 / 3036 / 453
Регистрация: 10.11.2010
Сообщений: 11,116
Записей в блоге: 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, ты чертовски прав, приятель:D

Не по теме:

Цитата Сообщение от 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
Заблокирован
Эксперт С++
25.10.2015, 12:19 #99
Цитата Сообщение от Tulosba Посмотреть сообщение
Убираем константу:
хех, вы не поняли.

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

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

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

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

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

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

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

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

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

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

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

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

вы можете привести пример хотя бы одного такого случая, когда я веник называл пряником.
потому что сейчас ваши речи - ложь и клевета.
0
Evg
Эксперт CАвтор FAQ
19277 / 7134 / 528
Регистрация: 30.03.2009
Сообщений: 19,976
Записей в блоге: 30
25.10.2015, 12:27 #100
Цитата Сообщение от hoggy Посмотреть сообщение
вы можете привести пример хотя бы одного такого случая, когда я веник называл пряником
Словом "константа" называть переменную
Использовать понятие "адрес константы"
Словом "inline" называть пропагирование константного значения
0
25.10.2015, 12:27
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.10.2015, 12:27

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

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

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


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

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

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