C/C++ Ready | Программирование
14.9K subscribers
1.24K photos
69 videos
566 links
Авторский канал по разработке на C и C++.
Ресурсы, гайды, задачи, шпаргалки.
Информация ежедневно пополняется!

Автор: @energy_it

РКН: https://clck.ru/3QREHc

Реклама на бирже: https://telega.in/c/cpp_ready
Download Telegram
🎄 Всех с наступающим новым 2025 2026 годом!

Поставлю себе цель: набрать более 25 тысяч подписчиков. Желаю каждому выполнить планы.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍31🔥118😁2
Как min/max из windows.h ломают std::min/std::max?

На Windows легко словить странную ошибку компиляции в невинном месте:
#include <windows.h>
#include <algorithm>

auto m = std::min(a, b);


Причина: windows.h (и некоторые связанные хедеры) могут определить макросы min/max. Тогда std::min(a, b) превращается в макро-подстановку, и начинает “ехать” всё, что выглядит как вызов функции.

Правильный вариант — отключить эти макросы до подключения Windows-заголовков:
#define NOMINMAX
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <algorithm>

auto m = std::min(a, b);


Если windows.h уже подключили (или его подтянула зависимость), можно убрать макросы точечно:
#include <windows.h>
#undef min
#undef max
#include <algorithm>


И есть аварийный трюк, если нельзя менять include-порядок: обернуть имя в скобки — тогда макрос не сработает:
auto m = (std::min)(a, b);


🔥 Итог: на Windows держи правило — `NOMINMAX` включён всегда, иначе стандартная библиотека будет ломаться в самых неожиданных местах.

📣 C++ Ready | #практика
Please open Telegram to view this post
VIEW IN TELEGRAM
👍22🤝98
🤓 Напоминалка для работы с Git.

Например, git push отправляет твои изменения на сервер, а git checkout позволяет быстро переключаться между ветками.

На картинке — 12 самых нужных команд, которые стоит держать под рукой.

Сохрани, чтобы не забыть!

📣 C++ Ready | #ресурс
Please open Telegram to view this post
VIEW IN TELEGRAM
22👍12🔥9
Как перестать возвращать -1 и “магические значения”, которые ломают логику?

Классика: функция “ищет/парсит/получает” и возвращает int, а “не найдено” кодируют как -1 или 0. Проблема в том, что это не видно из сигнатуры, и рано или поздно кто-то забывает проверить значение — баг готов.

Вместо этого возвращай std::optional<T> — тип прямо говорит: “значения может не быть”.

Пример:

сигнатура: std::optional<int> find_user_id(std::string_view name);
использование через проверку: if (id1) use_user(*id1);
самый удобный паттерн: if (auto id = find_user_id("morpheus")) use_user(*id);

В итоге интерфейс становится честным, проверки становятся естественными, а “забыл обработать” видно сразу при чтении кода.

🔥 Не забудь: *id безопасно только после проверки, а для значения по умолчанию есть id.value_or(-1) (если прям нужно).

📣 C++ Ready | #совет
Please open Telegram to view this post
VIEW IN TELEGRAM
20🔥6👍4🤝1
This media is not supported in your browser
VIEW IN TELEGRAM
✍️ Aizu Online Judge — онлайн-платформа для решения задач по программированию!

Бесплатный веб-сервис для обучения и практики программирования: собирает задачи от вводных («Hello World» и основ синтаксиса) до алгоритмов и структур данных, а также задачи из реальных программных соревнований и курсов.

📌 Оставляю ссылочку: onlinejudge

📣 C++ Ready | #ресурс
Please open Telegram to view this post
VIEW IN TELEGRAM
👍125🔥4
👩‍💻 Ускоряем C++ через std::pmr!

В этой шпаргалке — понятное объяснение, как заменить хаотичные new/delete на контролируемую стратегию памяти: как подключать pmr-контейнеры, когда выгоднее арена monotonic_buffer_resource, в каких задачах пул даёт прирост

📣 C++ Ready | #шпора
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥168👍4🤝2
📂 Шпаргалка по std::span в C++20!

На картинке — аккуратная “Span Cheat Sheet”, которая показывает, как работать с std::span: лёгким и не владеющим памятью представлением непрерывной последовательности объектов.

Показано, как создавать span из вектора или массива, как получать элементы, размер, поддиапазоны и почему span особенно удобен в параметрах функций.

Сохрани, чтобы больше не путаться с указателями и массивами

📣 C++ Ready | #ресурс
Please open Telegram to view this post
VIEW IN TELEGRAM
👍17🔥74
Как добавить “поле-настройку” в struct и не раздувать память?

Иногда хочется хранить рядом с данными “маркер/политику/стратегию”, но сам тип пустой. В обычном виде даже пустой член класса вроде Tag tag; может занимать место — компилятор часто обязан обеспечивать уникальность адресов и соблюдать выравнивание.

В C++20 есть атрибут [[no_unique_address]], который разрешает компилятору не выделять отдельную память под пустой член.

Сравни:
было: struct A { int value; Tag tag; };
стало: struct B { int value; [[no_unique_address]] Tag tag; };

Это видно через измерение размера:
std::cout << sizeof(A);
std::cout << sizeof(B);

Во многих ABI B будет меньше (или не больше), потому что Tag может “слиться” с уже существующим адресом внутри объекта.

🔥 Это оптимизация, а не гарантия. И ещё нюанс: у поля вроде [[no_unique_address]] Tag tag; адрес &obj.tag может совпасть с &obj, так что не полагайся на уникальность адреса.

📣 C++ Ready | #совет
Please open Telegram to view this post
VIEW IN TELEGRAM
9👍6🔥4🤝1
Поговорим про std::ssize: размер контейнера со знаком — без кастов и ловушек size_t!

Полезно в обратных циклах и сравнениях индексов, где size_t легко ломает логику.
std::vector<int> v{10, 20, 30};

for (int i = std::ssize(v) - 1; i >= 0; --i) {
std::cout << v[i] << ' ';
}


Почему так? Потому что v.size() возвращает size_t, а это беззнаковый тип. Из-за этого даже простые проверки и “обратные” циклы легко превращаются в ловушки: компилятор ругается на сравнение знакового и беззнакового, а иногда логика вообще ломается.

Классическая проблема выглядит так:
for (size_t i = v.size() - 1; i >= 0; --i) {
std::cout << v[i] << ' ';
}


Условие i >= 0 для size_t всегда истинно, и цикл может уйти в бесконечность, потому что i никогда не станет “меньше нуля”, он просто переполнится.

std::ssize(v) решает это правильно и без кастов. Он возвращает размер контейнера, но уже в знаковом типе, поэтому выражения вроде
std::ssize(v) - 1


и проверки i >= 0 ведут себя ожидаемо, а предупреждения компилятора исчезают.

🔥 std::ssize — маленькая привычка, которая убирает целый класс багов вокруг size_t, особенно в циклах и сравнениях индексов.

📣 C++ Ready | #практика
Please open Telegram to view this post
VIEW IN TELEGRAM
20👍7🔥4
☕️ Отличная статья — про то, как сделать многопоточность в HTTP-сервере без потока на каждого клиента!

В этой статье:
• Поймёшь, почему «один клиент — один поток» плохо
• Соберёшь ThreadPool: очередь задач, воркеры, синхронизация без лишних аллокаций
• Построишь конечный автомат: состояния, хендлеры, переходы для HTTP-клиента

🔊 Продолжай читать на Habr!


📣 C++ Ready | #статья
Please open Telegram to view this post
VIEW IN TELEGRAM
8👍3🔥3
👩‍💻 Разбираем scope_exit: “finally” для C++ без макросов и лишних классов!

Когда в функции несколько return, а ещё возможны исключения — легко забыть закрыть файл, откатить флаг или завершить “временный режим”. scope_exit решает это просто: задаёшь действие один раз — и оно гарантированно выполнится при выходе из блока.

В этом посте:

Поймём, как работает scope_exit и почему он похож на defer/finally;

Разберём базовый шаблон “ресурс + уборка рядом” на коротких примерах;

Посмотрим реальный кейс: мини-профайлер и автоматический rollback.


Освоив scope_exit, вы сможете делать cleanup в одном месте, не размазывая его по коду, и спокойно добавлять новые выходы из функции без риска “забыть убрать”.

📣 C++ Ready | #гайд
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥189👍6