const против #define
От: ND322  
Дата: 15.08.10 17:47
Оценка:
Доброго времени суток.
Есть программа с кучей вычислений. В вычислениях используется довольно много констант (десятки). В основном — действительные числа. Вопрос — как лучше их задавать?
const double myConst=-0.0010312;
или
#define myConst (-0.0010312)
Re: пофиг
От: пыщьх http://rsdn_user.livejournal.com
Дата: 15.08.10 17:54
Оценка:
Здравствуйте, ND322, Вы писали:

ND>Доброго времени суток.

ND>Есть программа с кучей вычислений. В вычислениях используется довольно много констант (десятки). В основном — действительные числа. Вопрос — как лучше их задавать?
ND>const double myConst=-0.0010312;
ND>или
ND>#define myConst (-0.0010312)

Полученный код будет одинаков. Скобки во втором примере абсолютно лишние. С точки зрения читабельности, я бы рассовал const double по нескольким namespace, чтобы была не линейная "простыня" из 100 констант, а, условно, 10 тематических групп по 10 констант. Удобнее будет интеллисенсом искать, да и документация генеренная опрятней получится.
Запретное обсуждение модерирования RSDN:
http://rsdn-user.livejournal.com/652.html
Re: const против #define
От: Аноним  
Дата: 16.08.10 03:30
Оценка:
Здравствуйте, ND322, Вы писали:

ND>const double myConst=-0.0010312;


Во всех книгах по C++ советуют этот способ.
Re: const против #define
От: okman Беларусь https://searchinform.ru/
Дата: 16.08.10 06:39
Оценка: 1 (1) +3
Здравствуйте, ND322.

#define — очень грубое средство, которое нужно использовать предельно аккуратно.
Можно, например, неосторожно написать #define MAX_SIZE MAX_STR + 1, а затем ломать голову,
почему MAX_SIZE * 2 не дает ожидаемого результата (и это еще нужно диагностировать).
Вдобавок, #define нельзя сделать членом пространства имен или класса.
Так что const однозначно.
Re[2]: пофиг
От: Centaur Россия  
Дата: 16.08.10 07:10
Оценка: +1 -2
Здравствуйте, пыщьх, Вы писали:

ND>>#define myConst (-0.0010312)


П>Скобки во втором примере абсолютно лишние.


Без скобок макрос будет допускать расширение синтаксиса, как минимум.

#include <iostream>

#define myConst -0.0010312

int main()
{
    std::cout << 1 myConst << std::endl;
}
Re[3]: пофиг
От: пыщьх http://rsdn_user.livejournal.com
Дата: 16.08.10 07:48
Оценка:
Здравствуйте, Centaur, Вы писали:

C>Без скобок макрос будет допускать расширение синтаксиса, как минимум.


C>
C>#include <iostream>

C>#define myConst -0.0010312

C>int main()
C>{
C>    std::cout << 1 myConst << std::endl;
C>}
C>

Согласен. Но юзкейс, ИМХО, с потолка. Плюс, это единственный пример, где скобки что-то дают (я не говорю о параметризированных макросах).
Запретное обсуждение модерирования RSDN:
http://rsdn-user.livejournal.com/652.html
Re: const против #define
От: fgrdn Земля  
Дата: 16.08.10 12:18
Оценка:
Здравствуйте, ND322, Вы писали:

лучше const чем define. ибо define это почти что magic number
in c/c++ we trust!
Re[4]: пофиг
От: Centaur Россия  
Дата: 16.08.10 13:12
Оценка: +3
Здравствуйте, пыщьх, Вы писали:

C>> std::cout << 1 myConst << std::endl;


П>Согласен. Но юзкейс, ИМХО, с потолка. Плюс, это единственный пример, где скобки что-то дают (я не говорю о параметризированных макросах).


IMHO с макросами не надо думать, где нужны скобки, а где не нужны. Надо ставить скобки над каждым параметром и над всем выражением. Ну, то есть, конечно, если нам таки нужен макрос (о чём как раз стоит задуматься первым делом).
Re[2]: пофиг
От: jerry_ru  
Дата: 16.08.10 20:28
Оценка:
Здравствуйте, пыщьх, Вы писали:

ND>>Есть программа с кучей вычислений. В вычислениях используется довольно много констант (десятки). В основном — действительные числа. Вопрос — как лучше их задавать?


Думаю const, потому что имена констант можно писать в различных нотациях( заглавными, маленькими, в верблюжьей) — красивее получается и да — простаства имен
Re[3]: пофиг
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 16.08.10 20:56
Оценка: 2 (2) +1
Здравствуйте, Centaur, Вы писали:

C>Без скобок макрос будет допускать расширение синтаксиса, как минимум.


C>
C>#include <iostream>

C>#define myConst -0.0010312

C>int main()
C>{
C>    std::cout << 1 myConst << std::endl;
C>}
C>


На фиг такие расширения! На фиг, на фиг, на фиг!
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[5]: пофиг
От: пыщьх http://rsdn_user.livejournal.com
Дата: 17.08.10 08:59
Оценка:
Здравствуйте, Centaur, Вы писали:

C>Здравствуйте, пыщьх, Вы писали:


C>>> std::cout << 1 myConst << std::endl;


П>>Согласен. Но юзкейс, ИМХО, с потолка. Плюс, это единственный пример, где скобки что-то дают (я не говорю о параметризированных макросах).


C>IMHO с макросами не надо думать, где нужны скобки, а где не нужны. Надо ставить скобки над каждым параметром и над всем выражением. Ну, то есть, конечно, если нам таки нужен макрос (о чём как раз стоит задуматься первым делом).

Угу. Благо есть static inline. Другое дело, что va_list незаинлайнится, но для этого есть #define MACRO(...) и __VA_ARGS__.
Запретное обсуждение модерирования RSDN:
http://rsdn-user.livejournal.com/652.html
Re[4]: пофиг
От: ND322  
Дата: 17.08.10 17:31
Оценка:
Здравствуйте, пыщьх, Вы писали:

П>Здравствуйте, Centaur, Вы писали:


C>>Без скобок макрос будет допускать расширение синтаксиса, как минимум.


C>>
C>>#include <iostream>

C>>#define myConst -0.0010312

C>>int main()
C>>{
C>>    std::cout << 1 myConst << std::endl;
C>>}
C>>

П>Согласен. Но юзкейс, ИМХО, с потолка. Плюс, это единственный пример, где скобки что-то дают (я не говорю о параметризированных макросах).

#define A -0.001
...
double B=2*sin(1-A)+.....;

Приплыли, будет ошибка. И это только самый простой случай. Пару раз неался, теперь на все отрицательные предпочитаю скобки ставить
Re: const против #define
От: ND322  
Дата: 17.08.10 17:32
Оценка: +1
Ну, раз большинство высказывается за const, наверное это правильно. Всем спасибо за советы!
Re: const против #define
От: x-code  
Дата: 21.08.10 19:26
Оценка: :))
Здравствуйте, ND322, Вы писали:

Один раз какой-то умник написал что-то типа
#define T 123

причем в одном из заголовочных файлов проекта.
T — это параметр шаблонов в куче библиотек, в том числе и stl. Прикольно было, когда в проекте вдруг возникли сотни совершенно непонятных ошибок, да еще и в системных библиотеках
Re[5]: пофиг
От: Centaur Россия  
Дата: 22.08.10 06:40
Оценка: 5 (1)
Здравствуйте, ND322, Вы писали:

ND>#define A -0.001

ND>...
ND>double B=2*sin(1-A)+.....;

ND>Приплыли, будет ошибка.


Я вот тоже хотел такой пример дать. Но проверил на Comeau Online — оно не ругалось. И g++ не ругается. И в стандарте написано, что лексический разбор происходит в третьей фазе, а макросы разворачиваются на четвёртой (c++2003:[lex.phases]/1). Так что минус в инициализации B и минус в развёрнутом макросе A не склеиваются в постдекремент единицы.

Хотя допускаю, что Visual C++ с её кривыми представлениями о фазах трансляции может тут споткнуться.
Re[6]: пофиг
От: vpchelko  
Дата: 26.08.10 10:21
Оценка:
Здравствуйте, пыщьх, Вы писали:

скобки, а где не нужны. Надо ставить скобки над каждым параметром и над всем выражением. Ну, то есть, конечно, если нам таки нужен макрос (о чём как раз стоит задуматься первым делом).
П>Угу. Благо есть static inline. Другое дело, что va_list незаинлайнится, но для этого есть #define MACRO(...) и __VA_ARGS__.

#define MACRO(...) не поддерживается на всех платформах особенно на студии.
Сало Украине, Героям Сала
Re[7]: пофиг
От: пыщьх http://rsdn_user.livejournal.com
Дата: 26.08.10 22:13
Оценка: +1 -1
Здравствуйте, vpchelko, Вы писали:

V>#define MACRO(...) не поддерживается на всех платформах особенно на студии.

Вы некрофил с Visual Studio 6.0? На 2008 все поддерживается.
Запретное обсуждение модерирования RSDN:
http://rsdn-user.livejournal.com/652.html
Re[3]: пофиг?
От: Erop Россия  
Дата: 27.08.10 03:34
Оценка: :)
Здравствуйте, Centaur, Вы писали:

C>Без скобок макрос будет допускать расширение синтаксиса, как минимум.


C>
C>    std::cout << 1 myConst << std::endl;
C>


Думаешь, со скобками не будет?..
    std::cout << sin myConst << std::endl;
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.