Re[33]: constexpr
От: rg45 СССР  
Дата: 15.01.23 12:17
Оценка:
Здравствуйте, T4r4sB, Вы писали:

R>>Понятно, зассышь. Гуляй, фуфел.


TB>Семок отсыпь, а


Опущенным не подаю.
--
Не можешь достичь желаемого — пожелай достигнутого.
Re[34]: constexpr
От: T4r4sB Россия  
Дата: 15.01.23 12:19
Оценка:
Здравствуйте, rg45, Вы писали:

R>Опущенным не подаю.

Ого, какой дерзкий попался! А ещё за хорошего мальчика пытался себя выдать
Re[2]: constexpr
От: LuciferSaratov Россия  
Дата: 15.01.23 12:28
Оценка: 15 (1) +1
Здравствуйте, rg45, Вы писали:

R>А вот тебе про #define: 16. Избегайте макросов


объясните мне, пожалуйста, почему следует избегать макросов?
доводы из статьи по ссылке я встречал много раз.
меня они не убеждают и входят в противоречие с моим личным опытом.
я не претендую на звание эксперта по С++, но в своей работе я много работаю с кодом на этом языке.
специфика такая, что мне приходится работать со старым (10+ лет) и очень старым (20+ лет) кодом разного качества.

объясню своё непонимание на примере доводов из статьи по ссылке выше:

Основная проблема с макросами С++ заключается в том, что они выглядят гораздо привлекательнее, чем являются таковыми на самом деле. Макросы игнорируют области видимости, игнорируют прочие возможности и правила языка, и заменяют все символы, которые переопределяют при помощи директивы #define, до самого конца файла. Применение макросов внешне походит на имя или вызов функции, но не имеет с ними ничего общего. Макросы "негигиеничны", в том смысле, что они могут быть раскрыты неожиданно, причем превратиться в зависимости от контекста их использования в самые разные конструкции. Подстановка текста, выполняемая макросами, делает написание хотя бы в небольшой степени "приличного" макроса смесью искусства и черной магии.


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

Программисты, которые полагают, что тяжелее всего расшифровать ошибки, связанные с шаблонами, вероятно, просто никогда не имели дела с плохо написанными или неверно использованными макросами. Шаблоны являются частью системы типов С++, и тем самым позволяют компилятору куда лучше справляться с ними, чем с макросами, которые имеют мало общего с языком программирования. Хуже того, в отличие от шаблонов неверные макросы могут быть раскрыты в нечто, что в силу чистой случайности скомпилируется, не имея при этом никакого смысла. И наконец, ошибка в макросе обнаруживается только после того, как макрос раскрывается, а не при его определении.


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

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

однако понять, что не так при ошибке компиляции иных шаблонов, особенно в компиляторах MSVC не самых свежих, мне гораздо сложнее, чем разобраться в коде с макросами.
при этом нет никакого средства, чтобы раскрыть шаблон и превратить его в нешаблонный код.
Re[3]: constexpr
От: rg45 СССР  
Дата: 15.01.23 12:34
Оценка:
Здравствуйте, LuciferSaratov, Вы писали:

R>>А вот тебе про #define: 16. Избегайте макросов


LS>объясните мне, пожалуйста, почему следует избегать макросов?

LS>доводы из статьи по ссылке я встречал много раз.
LS>меня они не убеждают и входят в противоречие с моим личным опытом.
LS>я не претендую на звание эксперта по С++, но в своей работе я много работаю с кодом на этом языке.
LS>специфика такая, что мне приходится работать со старым (10+ лет) и очень старым (20+ лет) кодом разного качества.

"Избегайте" не означает же "полностью исключите". "Избегайте" означает, не употребляйте там, где без этого легко можно обойтись. Почему так — в статье написано достаточно хорошо, по-моему. Макросы не подчиняются правилам областей видимости, на функциональные макросы не распространяется ADL, для макросов нельзя использовать перегрузку и концепты и пр. Если статья не убеждает, то у меня тоже вряд ли получится.

Есть такие случаи, когда без макросов просто никак, например, описание разного рода типов со статической структурой. Использование макросов может придать таким описаниям очень приятный декларативный вид, легко изменяемый и расширяемый и избавить от написания громадного количества сопровождающего кода, такого как загрузка-выгрузка, сериализация-десериализация, операции разные — сравнения, сложения, вычитания, вывода-вывода и пр. Но это же не значит, что нужно начать повсеместно использовать макросы вместо констант и функций.
--
Не можешь достичь желаемого — пожелай достигнутого.
Отредактировано 15.01.2023 14:23 rg45 . Предыдущая версия . Еще …
Отредактировано 15.01.2023 13:09 rg45 . Предыдущая версия .
Отредактировано 15.01.2023 13:00 rg45 . Предыдущая версия .
Отредактировано 15.01.2023 12:58 rg45 . Предыдущая версия .
Отредактировано 15.01.2023 12:53 rg45 . Предыдущая версия .
Отредактировано 15.01.2023 12:40 rg45 . Предыдущая версия .
Отредактировано 15.01.2023 12:39 rg45 . Предыдущая версия .
Re[20]: constexpr
От: wander  
Дата: 15.01.23 16:22
Оценка: +1 -1
Здравствуйте, rg45.

Зря ты с ним сцепился. У человека govnokod.ru из головы все никак не выветрится.
Re[21]: constexpr
От: rg45 СССР  
Дата: 15.01.23 17:03
Оценка:
Здравствуйте, wander, Вы писали:

W>Зря ты с ним сцепился. У человека govnokod.ru из головы все никак не выветрится.


Да сам жалею теперь. Можно было просто игнорировать.
--
Не можешь достичь желаемого — пожелай достигнутого.
Отредактировано 15.01.2023 17:09 rg45 . Предыдущая версия .
Re[3]: constexpr
От: Skorodum Россия  
Дата: 16.01.23 11:17
Оценка:
Здравствуйте, LuciferSaratov, Вы писали:

LS>да, написание годного макроса это действительно сложнее, чем кажется на первый взгляд.

LS>и я согласен, что корявый макрос может быть причиной множества различных проблем с компиляцией кода.
LS>однако, по моему опыту, навести порядок в макросах не так уж и сложно, здесь автор сильно драматизирует.
LS>написать хороший макрос тоже не очень сложно.
Порядок порядок подключения заголовочных файлов может очень сильно все поменять, как бы вы хорошо не писали.

LS>на мой взгляд, хороший шаблонный код писать никак не проще.

Зато он предсказуемей.

LS>понять концепцию текстовых замен, которые производятся препроцессором, гораздо проще, чем понять шаблоны С++.

Сложные задачи — сложные средства.
Re[3]: constexpr
От: B0FEE664  
Дата: 16.01.23 11:21
Оценка: 3 (1)
Здравствуйте, LuciferSaratov, Вы писали:

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

А как можно навести порядок в макросах?
Пример из практики: в проекте используются две сторонние библиотеки и обе из них определяют один и тот же define но в разные значения. Как разрешить коллизию?

LS>написать хороший макрос тоже не очень сложно.

LS>на мой взгляд, хороший шаблонный код писать никак не проще.
LS>понять концепцию текстовых замен, которые производятся препроцессором, гораздо проще, чем понять шаблоны С++.

Так вроде как макросы — это не вопрос сложности. Это скорее вопрос безопасности.

LS>по моему опыту, мне существенно больше проблем всегда доставлял тот код, который злоупотребляет шаблонами, нежели тот, который злоупотребляет макросами.

LS>при переносе кода, широко использующего шаблоны, с одной версии компилятора на другую версию того же компилятора или с одного компилятора на другой проблемы с шаблонами возникают часто.
LS>проблем же с макросами при смене компилятора я никогда не видел.

Пример с макросом при смене компилятора:
#ifdef NDEBUG
#define IF_DEBUG   /##/
#else
#define IF_DEBUG
#endif

— ошибка на gcc, но ok для MS cl.exe

В обратную сторону:
enum class FunResult
{
   OK,
   NO_DATA,
   ERROR
};

— ok для Linux, но на windows: ERROR — это дефайн в константу и код не скомпилируется (зависит от порядка includ'ов)


Ну и классика по функциям и дефайнам min и max, из-за чего декларация этих функций выглядит нестандартно под windows:
отсюда
_EXPORT_STD template <class _Ty>
class numeric_limits : public _Num_base { // numeric limits for arbitrary type _Ty (say little or nothing)
public:
    _NODISCARD static constexpr _Ty(min)() noexcept {  // Шеф! Шеф! Что это было!?
        return _Ty();
    }

    _NODISCARD static constexpr _Ty(max)() noexcept { // Шеф! Шеф! Что это было!?
        return _Ty();
    }

    _NODISCARD static constexpr _Ty lowest() noexcept {
        return _Ty();
    }

    _NODISCARD static constexpr _Ty epsilon() noexcept {
        return _Ty();
    }


LS>это что касается портирования на другие компиляторы, однако и при отладке кода макросы мне никогда особых проблем не доставляли.

LS>в конце концов, макросы всегда можно раскрыть в нужной части кода и найти ошибку.
Ага. Занятие часа на 4: вспомнить опцию компилятора, настроить переменные окружения, запустить компиляцию этого отдельного файла и по косвенным признакам найти результат подстановки...

LS>однако понять, что не так при ошибке компиляции иных шаблонов, особенно в компиляторах MSVC не самых свежих, мне гораздо сложнее, чем разобраться в коде с макросами.

LS>при этом нет никакого средства, чтобы раскрыть шаблон и превратить его в нешаблонный код.
С шаблонами сложнее, но зато шаблоны — намного более мощный инструмент.
И каждый день — без права на ошибку...
Re[35]: constexpr
От: RonWilson Россия  
Дата: 16.01.23 11:42
Оценка:
Открыл сразу всю ветку, тыкнул произвольное сообщение и прям сразу все понятно: был вопрос про constexpr, ясный и понятный ответ:

Что ж тебе залупы то везде видятся. У тебя за щекой там залупа, что ли
Пацанчик, закурить есть?
Семок отсыпь, а


Популярный, однако, спецификатор
Re[3]: constexpr
От: B0FEE664  
Дата: 16.01.23 11:44
Оценка:
Здравствуйте, T4r4sB, Вы писали:

TB>Где гарантия, что результат будет вычислен при компиляции? Есть какой-то список операций, дающий гарантию?

Да, есть: consteval
И каждый день — без права на ошибку...
Re[21]: constexpr
От: T4r4sB Россия  
Дата: 16.01.23 11:51
Оценка:
Здравствуйте, wander, Вы писали:

W>Здравствуйте, rg45.


W>Зря ты с ним сцепился. У человека govnokod.ru из головы все никак не выветрится.


То есть ты считаешь, что неадекватное поведение рг45 это ок что ли?
Я вижу его сообщения в лучшем случае как " да как ты посмел уточнить то что я говорю и усомниться в полноте моих высказываний111", не так что ли?
Отредактировано 16.01.2023 11:53 T4r4sB . Предыдущая версия .
Re[4]: constexpr
От: T4r4sB Россия  
Дата: 16.01.23 11:54
Оценка:
Здравствуйте, B0FEE664, Вы писали:

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


TB>>Где гарантия, что результат будет вычислен при компиляции? Есть какой-то список операций, дающий гарантию?

BFE>Да, есть: consteval

О боже, скольно ж там теперь видов констант, отличия которых поймет только гурман
Re: constexpr
От: Igore Россия  
Дата: 16.01.23 12:34
Оценка:
Здравствуйте, Shmj, Вы писали:

S>Как я понимаю, старый стиль, когда константы определялись виде #define — деканонизировали и предали анафеме. Теперь есть constexpr.


S>Вообще зачем это нужно — можете ли пример привести?

Ты когда константы заводишь, как их описываешь?
CHUNK_SIZE = 2097152
// или
CHUNK_SIZE = 2 * 1024 * 1024

Второе легче читается, плюс на consexpr можно нормально стиль использовать, ChunkSize, не боясь что макрос где то что то попортит, а дальше логика проста, есть зависимые константы которые хочется легко и понятно описать, чтобы их было можно легко и понятно поддерживать, и нужны уже функции времени компиляции.

S>Почему не использовать просто const, который времени выполнения?

Это разные вещи, const != consexpr, #define != constexpr. static не входит в constexpr, вот это кстати было удивительно узнать, почему по умолчанию consexpr это не static inline consexpr.
Re[22]: constexpr
От: wander  
Дата: 16.01.23 13:51
Оценка: +1 -1
Здравствуйте, T4r4sB, Вы писали:

TB>То есть ты считаешь, что неадекватное поведение рг45 это ок что ли?

Я считаю, что неадекватно себя вести сначала начал ты.
Свое отношение к реакции рг45 на твой выпад в #12 (и особенно в #16) я уже высказал и получил от него адекватный ответ.

TB>Я вижу его сообщения в лучшем случае как " да как ты посмел уточнить то что я говорю и усомниться в полноте моих высказываний111", не так что ли?

Это только твое восприятие.
Отредактировано 16.01.2023 13:53 wander . Предыдущая версия . Еще …
Отредактировано 16.01.2023 13:52 wander . Предыдущая версия .
Re[23]: constexpr
От: T4r4sB Россия  
Дата: 16.01.23 14:48
Оценка:
Здравствуйте, wander, Вы писали:


W>Свое отношение к реакции рг45 на твой выпад в #12 (и особенно в #16) я уже высказал и получил от него адекватный ответ.


Его хамство в re7 и re9 ты в упор не видишь? Или ему можно? Это твой друг что ли?
Адекватный ответ — это кукушка хвалит петуха за то что хвалит он кукушку?
Что не так в ре16? Я спокойно сказал что его фраза может быть понята неоднозначно с точки зрения норм русского языка, что тут блин не так?
Отредактировано 16.01.2023 14:51 T4r4sB . Предыдущая версия . Еще …
Отредактировано 16.01.2023 14:49 T4r4sB . Предыдущая версия .
Re[5]: constexpr
От: B0FEE664  
Дата: 16.01.23 15:05
Оценка:
Здравствуйте, T4r4sB, Вы писали:

BFE>>Да, есть: consteval

TB>О боже, скольно ж там теперь видов констант, отличия которых поймет только гурман

Добро пожаловать в волшебный и разнообразный мир C++ !
И каждый день — без права на ошибку...
Re[6]: constexpr
От: T4r4sB Россия  
Дата: 16.01.23 15:12
Оценка:
Здравствуйте, B0FEE664, Вы писали:

BFE>Добро пожаловать в волшебный и разнообразный мир C++ !


Да я-то в нем давно. Только на работе 14й стандарт, вот и беспокоюсь, не отстану ли.
Re[24]: constexpr
От: wander  
Дата: 16.01.23 16:56
Оценка: 16 (1) +2
Здравствуйте, T4r4sB, Вы писали:

TB>Его хамство в re7 и re9 ты в упор не видишь?

Там нет никакого хамства.
TB>Или ему можно?
Нет, ему не можно. Но хамства там нет.
TB>Это твой друг что ли?
Нет. Вообще ни разу. Мы за послоедние 10 лет едва ли парой фраз перекинулись и то только в этом разделе.
Просто ты несправедливо прикопался на ровном месте, вот я и среагировал.

TB>Адекватный ответ — это кукушка хвалит петуха за то что хвалит он кукушку?

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

TB>Что не так в ре16? Я спокойно сказал что его фраза может быть понята неоднозначно с точки зрения норм русского языка, что тут блин не так?

Вместо того, чтобы уточнить суть непонятного в словах оппонента, ты начинаешь упрекать его в неправильном применении норм русского языка.
Я уж помолчу о том, что никакой неоднозначности с точки зрения норм тут нет, это ладно.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.