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

Автор: @energy_it

Заявление в РКН: № 6382873737

Реклама на бирже: https://telega.in/c/cpp_ready
Download Telegram
Пишем свой assert с логированием и stacktrace!

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

Начнём с подключения библиотек из стандарта C++23 — ничего дополнительно не ставить не нужно:
#include <iostream>
#include <stdexcept>
#include <source_location>
#include <stacktrace>


Теперь объявим функцию-обёртку, которая будет бросать исключение с нужными данными:
void assert_fail(const char* expr,
const std::source_location& loc = std::source_location::current()) {
std::cerr << "ASSERTION FAILED: (" << expr << ")\n"
<< " at " << loc.file_name() << ":" << loc.line()
<< " in " << loc.function_name() << "\n"
<< "Stacktrace:\n" << std::stacktrace::current() << "\n";
std::terminate();
}


И сам макрос, использующий эту функцию:
#define ASSERT(expr) \
((expr) ? void(0) : assert_fail(#expr))


Давайте проверим на примере:
int factorial(int n) {
ASSERT(n >= 0);
return n <= 1 ? 1 : n * factorial(n - 1);
}

int main() {
std::cout << "5! = " << factorial(5) << "\n";
std::cout << "(-1)! = " << factorial(-1) << "\n"; // вызовет ASSERT
return 0;
}


При запуске получим:
5! = 120
ASSERTION FAILED: (n >= 0)
at example.cpp:8 in factorial()
Stacktrace:
#0 factorial() at example.cpp:8
#1 main() at example.cpp:14
#2 __libc_start_main
...


🔥 Таким образом ты получаешь собственный assert с детальным логом и стек-трейсом — никакой потери контекста при отладке и быстрый поиск причины крашей.

📣 C++ Ready | #практика
Please open Telegram to view this post
VIEW IN TELEGRAM
18👍10🔥6🤝1
👩‍💻 Создаём QR-код в один клик!

Когда обычный текст превращается в матрицу пикселей, этот инструмент без усилий создаёт чёткий QR-код, сохраняет его в PNG и подготавливает для мгновенного использования.

В этой задаче:

Быстро генерируется изображение для мобильного сканирования;

Минимум зависимостей — один заголовочный файл и PNG-кодек;

Лёгко интегрируется в любой C++-проект без сложных сборок.


Проверьте, как просто получить готовый QR-код и делиться ссылками мгновенно!

📣 C++ Ready | #задача
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥5413👍4🤝1
👩‍💻 Строковые проверки без лишнего кода!

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

В этом гайде:

Проверки текста без лишних вычислений всего одной функцией;

Пишем код яснее и понятнее буквально за пару строк;

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


Используйте новый подход, чтобы писать лаконичный, надёжный и быстро понятный код при работе с текстом.

📣 C++ Ready | #гайд
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥24👍87
👩‍💻 Командный старт-финиш!

Овладей std::barrier и забудь о рыхлых точках синхронизации: пусть потоки аккуратно приходят к контрольной черте, запускают единый callback и дружно рвутся в следующий раунд — без гонок, пропусков и лишних ожиданий.

📣 C++ Ready | #шпора
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥296👍4🤝1
Проверки на этапе компиляции — static_assert!

С C++11 можно валидировать условия ещё на этапе компиляции — до запуска программы. Если static_assert не выполняется, компилятор выдаст понятное сообщение об ошибке.

Подключаем заголовок с трейтом типов для последующих проверок:
#include <type_traits>


Простейшая проверка: убеждаемся, что int занимает хотя бы 4 байта в целевой системе:
static_assert(sizeof(int) >= 4, "int должен быть не менее 4 байт");


В шаблонах static_assert помогает выдавать информативные ошибки: при попытке check_float<int>() компиляция не пройдёт:
template<typename T>
void check_float() {
static_assert(std::is_floating_point_v<T>, "T должен быть плавающим типом");
}

int main() {
check_float<double>(); // OK
// check_float<int>(); // приведёт к ошибке: "T должен быть плавающим типом"
}


🔥 Это ваш первый фильтр ошибок, ловите некорректные условия сразу при сборке!

📣 C++ Ready | #практика
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥198👍3
👩‍💻 Мини-CLI для удобного просмотра последних git-коммитов!

Утилита на C++ с помощью libgit2 выводит N последних коммитов вместе с автором, временем и кратким сообщением в понятном консольном формате.

В этой CLI-утилите:

Помогает быстро просматривать историю важных изменений проекта;

Упрощает командную строку и избавляет от лишних действий;

Позволяет всегда видеть автора и время каждого коммита.


Этот инструмент станет отличным дополнением к рабочему процессу C++ проектов и ускорит анализ изменений.

📣 C++ Ready | #задача
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥16👍54🤝1