Доброго времени суток.
Есть программа с кучей вычислений. В вычислениях используется довольно много констант (десятки). В основном — действительные числа. Вопрос — как лучше их задавать?
const double myConst=-0.0010312;
или
#define myConst (-0.0010312)
Здравствуйте, ND322, Вы писали:
ND>Доброго времени суток. ND>Есть программа с кучей вычислений. В вычислениях используется довольно много констант (десятки). В основном — действительные числа. Вопрос — как лучше их задавать? ND>const double myConst=-0.0010312; ND>или ND>#define myConst (-0.0010312)
Полученный код будет одинаков. Скобки во втором примере абсолютно лишние. С точки зрения читабельности, я бы рассовал const double по нескольким namespace, чтобы была не линейная "простыня" из 100 констант, а, условно, 10 тематических групп по 10 констант. Удобнее будет интеллисенсом искать, да и документация генеренная опрятней получится.
#define — очень грубое средство, которое нужно использовать предельно аккуратно.
Можно, например, неосторожно написать #define MAX_SIZE MAX_STR + 1, а затем ломать голову,
почему MAX_SIZE * 2 не дает ожидаемого результата (и это еще нужно диагностировать).
Вдобавок, #define нельзя сделать членом пространства имен или класса.
Так что const однозначно.
Здравствуйте, пыщьх, Вы писали:
C>> std::cout << 1 myConst << std::endl;
П>Согласен. Но юзкейс, ИМХО, с потолка. Плюс, это единственный пример, где скобки что-то дают (я не говорю о параметризированных макросах).
IMHO с макросами не надо думать, где нужны скобки, а где не нужны. Надо ставить скобки над каждым параметром и над всем выражением. Ну, то есть, конечно, если нам таки нужен макрос (о чём как раз стоит задуматься первым делом).
Здравствуйте, пыщьх, Вы писали:
ND>>Есть программа с кучей вычислений. В вычислениях используется довольно много констант (десятки). В основном — действительные числа. Вопрос — как лучше их задавать?
Думаю const, потому что имена констант можно писать в различных нотациях( заглавными, маленькими, в верблюжьей) — красивее получается и да — простаства имен
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, Centaur, Вы писали:
C>Здравствуйте, пыщьх, Вы писали:
C>>> std::cout << 1 myConst << std::endl;
П>>Согласен. Но юзкейс, ИМХО, с потолка. Плюс, это единственный пример, где скобки что-то дают (я не говорю о параметризированных макросах).
C>IMHO с макросами не надо думать, где нужны скобки, а где не нужны. Надо ставить скобки над каждым параметром и над всем выражением. Ну, то есть, конечно, если нам таки нужен макрос (о чём как раз стоит задуматься первым делом).
Угу. Благо есть static inline. Другое дело, что va_list незаинлайнится, но для этого есть #define MACRO(...) и __VA_ARGS__.
причем в одном из заголовочных файлов проекта.
T — это параметр шаблонов в куче библиотек, в том числе и stl. Прикольно было, когда в проекте вдруг возникли сотни совершенно непонятных ошибок, да еще и в системных библиотеках
Здравствуйте, 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++ с её кривыми представлениями о фазах трансляции может тут споткнуться.
скобки, а где не нужны. Надо ставить скобки над каждым параметром и над всем выражением. Ну, то есть, конечно, если нам таки нужен макрос (о чём как раз стоит задуматься первым делом). П>Угу. Благо есть static inline. Другое дело, что va_list незаинлайнится, но для этого есть #define MACRO(...) и __VA_ARGS__.
#define MACRO(...) не поддерживается на всех платформах особенно на студии.
Здравствуйте, vpchelko, Вы писали:
V>#define MACRO(...) не поддерживается на всех платформах особенно на студии.
Вы некрофил с Visual Studio 6.0? На 2008 все поддерживается.
Здравствуйте, Centaur, Вы писали:
C>Без скобок макрос будет допускать расширение синтаксиса, как минимум.
C>
C> std::cout << 1 myConst << std::endl;
C>
Думаешь, со скобками не будет?..
std::cout << sin myConst << std::endl;
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском