0 / 0 / 0
Регистрация: 05.01.2010
Сообщений: 9
1

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

08.01.2010, 03:29. Показов 16649. Ответов 115

Author24 — интернет-сервис помощи студентам
После прочтения про директиву препроцессора define возник вопрос по поводу применения define, как функции:
C++
1
#define QQ (q) (q^q)
Можно же улучшить читаемость кода, используя вместо функций именно директиву define. Или у данного использования макроса есть подводные камки какие-то? Да и объем кода в разы сократиться, так как для define будет достаточно всего-навсего одной строчки.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.01.2010, 03:29
Ответы с готовыми решениями:

Чем так плох чипсет P31?
Здрасти! Скажите чем так плох этот чипсет?

чем плох mysql_query
Просматривал вакансию на пхп juniora наткнулся на такое требование "В коде нет и намека на...

Чем плох uCoz?
Добрый день! Хотел бы услышать объективные мнения специалистов, на тему "Почему юКоз нельзя...

Чем плох goto?
Вы хотели интересных тем? Так вот, я на днях думал, а почему goto так плох, и решил загуглить,...

115
Неэпический
17869 / 10634 / 2054
Регистрация: 27.09.2012
Сообщений: 26,736
Записей в блоге: 1
24.10.2015, 22:03 81
Author24 — интернет-сервис помощи студентам
Цитата Сообщение от 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
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
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
:)
Эксперт С++
4773 / 3267 / 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
Неэпический
17869 / 10634 / 2054
Регистрация: 27.09.2012
Сообщений: 26,736
Записей в блоге: 1
24.10.2015, 22:47 86

Не по теме:

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



Добавлено через 35 секунд
Цитата Сообщение от Tulosba Посмотреть сообщение
Только вот при таком определении будет UB
так никто не утверждает обратного.
0
:)
Эксперт С++
4773 / 3267 / 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
Неэпический
17869 / 10634 / 2054
Регистрация: 27.09.2012
Сообщений: 26,736
Записей в блоге: 1
24.10.2015, 23:03 89
Цитата Сообщение от Tulosba Посмотреть сообщение
Ну никто из Croessmah'ов и не утверждал не обратного. Или утверждал?
Не обратного не утверждал, думаю, здесь все посвящены в это и так.
0
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,511
24.10.2015, 23:06 90
бяда С(и плюсов) в том что он пытается быть языком высокого уровня и в тоже время разрешает низкоуровневый доступ
и в результате на каждое нововведение ограничивающие программиста, найдется "финт ушами" который это нововведение нивелирует
если есть неконтролируемый доступ к памяти, особенно на архитектуре фон Немана,считай что все ограничения обошли
0
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
24.10.2015, 23:16 91
ValeryS, это не беда плюсов, это беда холиварщиков.
3
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,511
24.10.2015, 23:20 92
Цитата Сообщение от castaway Посмотреть сообщение
это беда
Цитата Сообщение от ValeryS Посмотреть сообщение
бяда
видишь как я слово написал что как бы подразумевает
0
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
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
Эксперт С++
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
25.10.2015, 12:19 99
Цитата Сообщение от Tulosba Посмотреть сообщение
Убираем константу:
хех, вы не поняли.

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

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

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

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

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

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

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

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

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

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

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

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

вы можете привести пример хотя бы одного такого случая, когда я веник называл пряником.
потому что сейчас ваши речи - ложь и клевета.
0
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
25.10.2015, 12:27 100
Цитата Сообщение от hoggy Посмотреть сообщение
вы можете привести пример хотя бы одного такого случая, когда я веник называл пряником
Словом "константа" называть переменную
Использовать понятие "адрес константы"
Словом "inline" называть пропагирование константного значения
0
25.10.2015, 12:27
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.10.2015, 12:27
Помогаю со студенческими работами здесь

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

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

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

Чем плох ProBuilder (Unity3D)?
Мне советовали не использовать ProBuilder, а моделить в какой-нибудь проге - текстурить и потом...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru