Telegram Web
✏️ Промпт дня: Поиск и исправление ошибок в C++

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

🍴 Промпт для AI-помощника:

Review this code for errors and refactor to fix any issues:

[Вставь свой код]


‼️ Пример использования промпта:

Было:
class DataProcessor {
public:
char* processData(char* input) {
char* buffer = new char[100];
strcpy(buffer, input);
return buffer;
}

void cleanup() {
// забыли освободить память
}
};

void example() {
DataProcessor dp;
char* result = dp.processData("some long input data that might overflow");
// утечка памяти - не вызываем delete
}


Стало (после AI-ревью):

class DataProcessor {
public:
std::string ProcessData(const std::string& input) {
// Используем std::string для безопасности
return input; // или любая другая обработка
}

// Деструктор не нужен - RAII работает автоматически
};

void Example() {
DataProcessor dp;
std::string result = dp.ProcessData("some long input data that might overflow");
// Автоматическое управление памятью
}



Что исправил AI:

Убрал потенциальный buffer overflow
Заменил ручное управление памятью на RAII
Использовал безопасные std::string вместо char*
Исправил стиль именования функций
Устранил утечки памяти

⛄️ А используете ли вы AI для ревью кода? Поделитесь опытом в комментариях!

Библиотека C/C++ разработчика #буст
Please open Telegram to view this post
VIEW IN TELEGRAM
🌚85😁2
🔄 std::source_location: автоматическое логирование

Забудьте FILE и LINE! std::source_location автоматически получает информацию о местоположении в коде.


#include <iostream>
#include <source_location>
#include <string_view>

void log_error(std::string_view message,
const std::source_location& loc = std::source_location::current()) {
std::cout << "ОШИБКА в " << loc.file_name()
<< ":" << loc.line()
<< " в функции " << loc.function_name()
<< " - " << message << std::endl;
}

void problematic_function() {
log_error("Что-то пошло не так!"); // Автоматически получит location
}

int main() {
log_error("Ошибка инициализации");
problematic_function();
return 0;
}


Важно: source_location вычисляется в точке вызова, не в точке определения функции.

Библиотека C/C++ разработчика #буст
🔥201👏1
🔨 Какой системой сборки пользоваться?

Непопулярное мнение: CMake — это изолента для фундаментальных проблем C++.


Все жалуются на CMake syntax, dependency hell, cross-platform issues... Но используют. Потому что альтернативы еще хуже?

Пробовал Bazel? Google's build system — мощный, но кривая изучения как у рокет саенс. Meson? Быстрый и простой, но маленькой экосистемой. Ninja? Low-level, но нужен генератор.

Реальная проблема: C++ не имеет стандартного пакетного менеджера! Cargo у Rust, npm у Node.js, pip у Python. А у нас что? Conan? vcpkg? git submodules? 😤

Личный опыт: потратил неделю на настройку CMake для проекта, который в Rust собрался бы одной командой cargo build.

Острый вопрос: Может проблема не в build system, а в чём-то другом?

📊 Твой любимый build system:

❤️ CMake (стандарт де-факто)
🔥 Bazel (Google way)
👏 Meson (простота)
🌚 Все плохие, но выбираю...

Библиотека C/C++ разработчика
67🌚15👏7🔥2😁1
How to: Создание собственного итератора для контейнера

Периодически требуется реализовать интеграцию с STL алгоритмами. Для этого необходимо реализовать правильные API.

Проблема: Нужно создать контейнер, работающий с range-based for и STL.


✏️ Решение:

1️⃣ Реализуйте iterator traits
2️⃣ Определите begin() и end()
3️⃣ Поддержите const итераторы

#include <iterator>
#include <algorithm>
#include <iostream>

template<typename T>
class CircularBuffer {
T* data;
size_t capacity_;
size_t size_;
size_t head_ = 0;

public:
explicit CircularBuffer(size_t capacity)
: data(new T[capacity]), capacity_(capacity), size_(0) {}

~CircularBuffer() { delete[] data; }

// Iterator class
class iterator {
T* ptr;
size_t capacity;
size_t index;

public:
using iterator_category = std::forward_iterator_tag;
using value_type = T;
using difference_type = std::ptrdiff_t;
using pointer = T*;
using reference = T&;

iterator(T* ptr, size_t capacity, size_t index)
: ptr(ptr), capacity(capacity), index(index) {}

reference operator*() { return ptr[index % capacity]; }
pointer operator->() { return &ptr[index % capacity]; }

iterator& operator++() {
++index;
return *this;
}

iterator operator++(int) {
iterator tmp = *this;
++index;
return tmp;
}

bool operator==(const iterator& other) const {
return index == other.index;
}

bool operator!=(const iterator& other) const {
return !(*this == other);
}
};

void push(const T& item) {
data[(head_ + size_) % capacity_] = item;
if (size_ < capacity_) {
++size_;
} else {
++head_;
head_ %= capacity_;
}
}

iterator begin() { return iterator(data, capacity_, head_); }
iterator end() { return iterator(data, capacity_, head_ + size_); }

size_t size() const { return size_; }
bool empty() const { return size_ == 0; }
};

int main() {
CircularBuffer<int> buffer(5);

// Заполняем буфер
for (int i = 1; i <= 7; ++i) {
buffer.push(i);
}

// Range-based for работает!
for (const auto& item : buffer) {
std::cout << item << " ";
}
std::cout << std::endl;

// STL алгоритмы работают!
auto it = std::find(buffer.begin(), buffer.end(), 5);
if (it != buffer.end()) {
std::cout << "Found: " << *it << std::endl;
}
}


Частые ошибки: Не реализовать все необходимые operator для итератора.

💡 Совет: Правильные итераторы делают ваш контейнер first-class citizen в ST.

Библиотека C/C++ разработчика #буст
Please open Telegram to view this post
VIEW IN TELEGRAM
3👍3
🤖 Сборка фреймворка QT из исходников

Официальный инсталлятор Qt требует регистрацию и недоступен в РФ, а готовые бинарники не всегда подходят...


💡 Автор статьи делится подробным руководством по сборке Qt из исходников с компилятором MinGW — полностью свободным решением.

❗️ Ключевые моменты статьи:

• пошаговая инструкция сборки Qt 5.15.17 и Qt 6.9.0 с MinGW
• настройка поддержки OpenSSL для работы с HTTPS
• конфигурация Qt Creator и создание кастомных наборов модулей

Основной фокус — практические аспекты сборки с учетом всех подводных камней: правильный выбор версий компиляторов, настройка путей, сборка документации и примеров.

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

Вы узнаете, что компилятор Microsoft не является полностью свободным (Community Edition нельзя использовать компаниям с выручкой >$1M), а MinGW позволяет получить лицензионно чистую среду разработки без ограничений.

👉 Статья

Библиотека C/C++ разработчика
8🤩4
📰 Свеженькое из мира C++

Недельный дайджест новостей о разных аспектах программирования и интересных проектах в мире C++.

🥳 Интересное:

Qt Quick/QML — декларативный UI для C++ приложений
Отладка сопрограмм C++ — доклад о практических аспектах отладки сопрограмм

😎 Полезное:

Исключения в C++ — набор карточек на базовые темы касающиеся исключений
Поиск и исправление ошибок в C++ — промпт с помощью которого можно быстро находить ошибки в коде
std::source_location — полезная фишка C++ с помощью которой можно облегчить легирование
Создание собственного итератора для контейнера
Сборка фреймворка QT из исходников

🖨️Интересные проекты:

LEGO Island — портативная версия LEGO Island основанная на декомпилированном проекте
Hyprland — независимый тайловый компоновщик
Dragonfly — in-memory хранилище данных

Библиотека C/C++ разработчика #свежак
2👍2👾1
🏖 Подборка вакансий для C++-разработчиков за неделю

Senior С++ / Rust Developer — от 300 000 и до 450 000 ₽ Гибрид (Москва, Санкт-Петербург)

Разработчик C++ — от 350 000 и до 500 000 ₽ Гибрид (Москва)

C/C++ Developer — от 350 000 и до 500 000 ₽ Гибрид (Москва)

Разработчик на C++ — от 250 000 и до 350 000 ₽ Офис (Москва)

➡️ Еще больше топовых вакансий — в нашем канале C++ jobs

Библиотека C/C++ разработчика
🔥2
⚙️ Boost.Program_options

Устали писать парсинг argc/argv вручную для каждого приложения?


Boost.Program_options — это библиотека для элегантного парсинга аргументов командной строки и конфигурационных файлов с автоматической генерацией help и валидацией параметров.

👉 Установка:

# Часть Boost libraries
sudo apt install libboost-program-options-dev

# Или через vcpkg: vcpkg install boost-program-options



💡 Примеры использования:

#include <boost/program_options.hpp>
namespace po = boost::program_options;

po::options_description desc("Options");
desc.add_options()
("help,h", "Help message")
("input,i", po::value<string>(), "Input file")
("verbose,v", "Verbose output");

po::variables_map vm;
po::store(po::parse_command_line(argc, argv, desc), vm);


✍️ Дополнительные возможности:

— Поддержка конфигурационных файлов
— Валидация типов и значений
— Группировка опций
— Автоматическая генерация справки


🔍 Специальная фича:

// Комбинирование источников конфигурации
po::store(po::parse_command_line(argc, argv, desc), vm);
po::store(po::parse_config_file("config.ini", desc), vm);
po::notify(vm); // Применение всех значений


Библиотека C/C++ разработчика #буст
🔥53👍3❤‍🔥1
🧨 C++26 получил Reflection

«Когда же в C++ появится нормальное метапрограммирование без этих template-кошмаров?»


💡 Комитет ISO C++ только что проголосовал за включение compile-time reflection в C++26, и Хана Дусикова («Ms. Constexpr») охарактеризовала это всего словами: «Целый новый язык».

Ключевые возможности reflection в C++26:

• отражение типов и генерация кода на их основе в compile-time
• автоматическое создание биндингов для Python/JS прямо из C++ кода
• упрощение build-систем и тулчейнов через метаданные

Основной фокус — это первый шаг к полноценному метапрограммированию без template-магии, который позволит генерировать произвольный C++ код на основе информации о типах.

Актуально для всех C++ разработчиков — от новичков до архитекторов крупных систем, так как reflection кардинально изменит подходы к написанию кода.

Герб Саттер называет это «более трансформационным, чем любые 10 других крупных фич стандарта вместе взятых».

👉 Заметка

Библиотека C/C++ разработчика
🔥25🤔72😢1
✏️ Промпт дня: Расширение функциональности через параметры


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


☀️ Решение с помощью AI

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

Add a parameter to this function to do [ФУНКЦИОНАЛЬНОСТЬ]

[ВСТАВТЕ ВАШ КОД ЗДЕСЬ]



🧋 Пример трансформации

До:
void processData(const std::vector<int>& data) {
for (const auto& item : data) {
std::cout << item << std::endl;
}
}



После (добавили параметр для кастомного форматирования):
void processData(const std::vector<int>& data, 
const std::string& format = "{}: {}") {
for (size_t i = 0; i < data.size(); ++i) {
std::cout << std::format(format, i, data[i]) << std::endl;
}
}



✏️ Как часто вам приходится расширять функциональность существующих функций?

Библиотека C/C++ разработчика
#буст
Please open Telegram to view this post
VIEW IN TELEGRAM
😢6🔥2🥱21
🔥 Последняя неделя перед стартом курса по AI-агентам

Старт курса уже 5го числа! Если вы планировали вписаться — сейчас ПОСЛЕДНИЙ шанс забронировать место

На курсе:
разложим LLM по косточкам: токенизация, SFT, PEFT, инференс
— соберём RAG и научимся оценивать его адекватно
— построим настоящую мультиагентную систему — архитектуру, которая умеет расти
— разберём CoPilot, сломаем через prompt injection (спасибо Максу)
— и наконец, посмотрим, как это работает в MCP и реальных кейсах

📍 Это 5 живых вебинаров + раздатка + домашки + чат с преподавателями

И главное — возможность реально разобраться, как проектировать системы на LLM, а не просто «поиграться с API»

👉 Курс здесь
Чек-лист: Автоматическое форматирование кода для единообразного стиля в команде


🎯 Настройка и конфигурация

✓ Создайте .clang-format файл в корне проекта
✓ Выберите базовый стиль
✓ Настройте отступы, скобки и переносы строк
✓ Добавьте специфичные правила для вашего проекта

🎯 Интеграция с инструментами

✓ Настройте автоформатирование в IDE
✓ Используйте pre-commit hooks для Git
✓ Интегрируйте с CI для проверки стиля
✓ Добавьте команды форматирования в CMake

🎯 Командная работа

✓ Документируйте стиль кода в README
✓ Проводите code review с проверкой стиля
✓ Используйте .clang-format-ignore для исключений
✓ Настройте автоматическое форматирование

🎯 Продвинутые возможности

✓ Используйте clang-format-diff для частичного форматирования
✓ Настройте языкоспецифичные правила
✓ Применяйте макросы для кастомизации
✓ Интегрируйте с другими linter'ами

Как измерить результат: Подсчитайте количество комментариев по стилю кода в code review.

Библиотека C/C++ разработчика #буст
🔥4🥰1🤩1
🧠 «Поиграйся с LLM, почитай про агентов — и сам поймёшь, как это работает»

Это один из самых бесполезных советов, который мы слышали в адрес тех, кто хочет разобраться в AI-агентах.

Поиграйся — это как?
Потыкать пару промптов в ChatGPT и решить, что теперь ты можешь строить мультиагентные системы? 🤡 Ну-ну.

AI-агенты — это не «очередная обёртка над GPT». Это архитектура. Состояния, инструменты, цепочки вызовов, память, оценка качества и адекватность поведения.

➡️ Чтобы разобраться, нужно:
— понимать, как устроен LLM под капотом
— уметь подключать внешние данные (RAG, retrievers, rerankers)
— уметь масштабировать и дебажить поведение агентов
— разбираться в фреймворках вроде AutoGen, CrewAI, LangChain
— знать, как всё это тащится в прод

Если вы реально хотите не «поиграться», а научиться собирать рабочие агентные системы — у нас стартует курс по разработке ИИ-агентов 5го июля

P.S: не упусти свой шанс, промокод: LASTCALL на 10.000₽
😁1
2025/07/11 21:30:35
Back to Top
HTML Embed Code: