Библиотека C/C++ разработчика | cpp, boost, qt
19.9K subscribers
1.89K photos
55 videos
16 files
4.1K links
Все самое полезное для плюсовика и сишника в одном канале.

По рекламе: @proglib_adv

Учиться у нас: https://proglib.io/w/d6cd2932

Для обратной связи: @proglibrary_feeedback_bot

РКН: https://gosuslugi.ru/snet/67a5bac324c8ba6dcaa1ad17
Download Telegram
🦀 Транспиляция кода: от одного языка к другому

Представьте ситуацию: вы нашли идеальное решение на GitHub, но оно написано не на том языке. Или ваш руководитель прочитал статью о новом фреймворке, и теперь нужно переписывать всю кодовую базу. Знакомо?

Хорошая новость: современные LLM-модели отлично справляются с транспиляцией кода между языками программирования.


✏️ Промпт

Rewrite the following code in C++:

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



🍴 Пример использования

# Исходный Python код

def count_words(text):
"""Count word frequency in text"""
words = text.lower().split()
freq = {}
for word in words:
freq[word] = freq.get(word, 0) + 1
return freq

# Пример использования
text = "hello world hello python world"
print(count_words(text))
# Output: {'hello': 2, 'world': 2, 'python': 1}


Результат:

#include <iostream>
#include <string>
#include <map>
#include <sstream>
#include <algorithm>

std::map<std::string, int> count_words(const std::string& text) {
std::map<std::string, int> freq;
std::istringstream stream(text);
std::string word;

while (stream >> word) {
// Convert to lowercase
std::transform(word.begin(), word.end(), word.begin(), ::tolower);
freq[word]++;
}

return freq;
}

int main() {
std::string text = "hello world hello python world";
auto result = count_words(text);

for (const auto& [word, count] : result) {
std::cout << word << ": " << count << std::endl;
}

return 0;
}


Библиотека C/C++ разработчика


#буст
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9👾1
⚡️ VS Code: мультикурсоры

Знакомо ли тебе чувство, когда нужно изменить одинаковые переменные в 15 местах, и ты тыкаешь мышкой чтобы поменять каждое из них?


Решение: Ctrl+D - выделяет каждое следующее вхождения

Выдели слово → жми Ctrl+D для каждого следующего → редактируй все сразу

// Было
int temp = 0;
temp = getValue();
process(temp);
return temp;

// Жмёшь Ctrl+D три раза на temp и меняешь
int result = 0;
result = getValue();
process(result);
return result;


💣
Бонус: Ctrl+Shift+L выделяет ВСЕ вхождения сразу. Но осторожно - может зацепить лишнее.


Библиотека C/C++ разработчика


#буст
👍83
🪣 50 фраз которые портят ваше резюме

Рекрутеры видят одно и то же в каждом втором резюме: «командный игрок», «работаю с современными технологиями», «обладаю аналитическим складом ума». Эти клише не просто скучны — они ставят под сомнение вашу компетентность. Разбираем 50+ шаблонных фраз по всем IT-направлениям и показываем, как их заменить или вообще выкинуть.

Читаем дальше...

Библиотека C/C++ разработчика

#буст
😁2
🍬 Потоки могут общаться через condition_variable

Чтобы один поток ожидал другого можно воспользоваться condition_variable.


🍴 Пошаговое решение:

1️⃣ Создайте condition_variable и mutex
2️⃣ Поток ждёт через wait()
3️⃣ Другой поток сигналит через notify_one/notify_all

#include <condition_variable>
#include <mutex>
#include <thread>
#include <iostream>

std::mutex mtx;
std::condition_variable cv;
bool ready = false;

void worker() {
std::unique_lock<std::mutex> lock(mtx);
cv.wait(lock, []{ return ready; }); // Ждём сигнала

std::cout << "Worker started!\n";
}

int main() {
std::thread t(worker);

std::this_thread::sleep_for(std::chrono::seconds(1));

{
std::lock_guard<std::mutex> lock(mtx);
ready = true;
}
cv.notify_one(); // Будим поток

t.join();
return 0;
}


❗️ Частая ошибка: Забыть проверять условие в wait()

💡 Совет: Всегда передавайте предикат в wait()


Библиотека C/C++ разработчика

#буст
Please open Telegram to view this post
VIEW IN TELEGRAM
3👍2🙏1
🔥 Фича: std::scoped_lock (C++17)

Захват нескольких мьютексов вручную рискует deadlock при неправильном порядке.

std::scoped_lock атомарно захватывает несколько мьютексов, избегая взаимоблокировок.

До:

std::lock_guard lock1(mtx1);
std::lock_guard lock2(mtx2); // deadlock риск!


После:

std::scoped_lock lock(mtx1, mtx2); // безопасно



💡 Используете std::scoped_lock в своём коде?

Библиотека C/C++ разработчика

#буст
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥81
💡 C++: Генерация шаблонного кода

Запуск нового C++ проекта часто начинается с рутины: создание классов с конструкторами, деструкторами, операторами копирования/перемещения, шаблоны паттернов... Звучит очень знакомо и ужасно скучно. Что хотябы немного облегчить себе задачу можно воспользоваться AI.

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


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


Промпт:

Создай boilerplate код для C++ класса ResourceManager, 
который управляет игровыми ресурсами (текстуры, звуки).
Класс должен быть синглтоном,
шаблонными методами загрузки/получения ресурсов и
thread-safe доступом.


Результат:


#pragma once
#include <memory>
#include <unordered_map>
#include <mutex>
#include <string>

template<typename T>
class ResourceManager {
private:
std::unordered_map<std::string, std::shared_ptr<T>> resources;
mutable std::mutex mutex;

// Приватный конструктор для синглтона
ResourceManager() = default;

public:
// Удаляем конструктор копирования и оператор присваивания
ResourceManager(const ResourceManager&) = delete;
ResourceManager& operator=(const ResourceManager&) = delete;

// Конструктор и оператор перемещения
ResourceManager(ResourceManager&&) noexcept = default;
ResourceManager& operator=(ResourceManager&&) noexcept = default;

// Деструктор
~ResourceManager() = default;

// Получение единственного экземпляра (Meyer's Singleton)
static ResourceManager& getInstance() {
static ResourceManager instance;
return instance;
}

// Загрузка ресурса
template<typename... Args>
bool load(const std::string& id, Args&&... args) {
std::lock_guard<std::mutex> lock(mutex);

if (resources.find(id) != resources.end()) {
return false; // Уже загружен
}

auto resource = std::make_shared<T>(std::forward<Args>(args)...);
resources[id] = resource;
return true;
}

// Получение ресурса
std::shared_ptr<T> get(const std::string& id) const {
std::lock_guard<std::mutex> lock(mutex);

auto it = resources.find(id);
return (it != resources.end()) ? it->second : nullptr;
}

// Выгрузка ресурса
bool unload(const std::string& id) {
std::lock_guard<std::mutex> lock(mutex);
return resources.erase(id) > 0;
}

// Очистка всех ресурсов
void clear() {
std::lock_guard<std::mutex> lock(mutex);
resources.clear();
}
};


🍿 Что получили?

• Полностью рабочий шаблонный класс
• Thread-safe операции

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

Библиотека C/C++ разработчика

#буст
Please open Telegram to view this post
VIEW IN TELEGRAM
🥱9👍41
🚫 14 вопросов, после которых вам не перезвонят

Вы прошли технический скрининг, решили все алгоритмические задачки, показали крутое портфолио — а оффера нет. Возможно, дело в том, что вы спросили. Один неудачный вопрос может перечеркнуть все ваши hard skills, особенно когда soft skills стали важнее кода. Разбираем фразы-убийцы карьеры.

👉 Читать дальше...

Библиотека C/C++ разработчика

#буст
😁2🤔1
- Как написать собственную кинематику для робота-манипулятора

Команда ZeBrains написала с нуля два алгоритма обратной кинематики для робота xArm 2.0, который должен был ловить объекты на конвейере.

Что внутри:
• полные математические выкладки с геометрическими схемами
• готовый код на C++ с интеграцией в ROS2
•два варианта кинематики под разные задачи движения

Авторы не просто показывают формулы — они объясняют весь путь: от анализа проблемы через теорему косинусов до тестирования в Unreal Engine и работы на реальном стенде.

Критично полезно, если вы работаете с нестандартными конфигурациями роботов, где библиотеки дают сбой.

👉 Статья

Библиотека C/C++ разработчика

#буст
3👍1
🎫 std::latch — одноразовый счетчик


🩹 Проблема:

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


💡 Решение:

std::latch (C++20) — это одноразовый счетчик обратного отсчета. Потоки уменьшают счетчик, а другие ждут, пока он достигнет нуля. После срабатывания latch нельзя переиспользовать.


✏️ Пример кода:

#include <iostream>
#include <thread>
#include <latch>
#include <vector>

void worker_init(int id, std::latch& ready_signal) {
// Имитация инициализации ресурсов
std::cout << "Поток " << id << " инициализируется...\n";
std::this_thread::sleep_for(std::chrono::milliseconds(100 * id));

std::cout << "Поток " << id << " готов\n";
ready_signal.count_down(); // Уменьшаем счетчик
}

void worker_process(int id, std::latch& start_signal) {
std::cout << "Поток " << id << " ждет сигнал старта...\n";
start_signal.wait(); // Ждем пока счетчик станет 0

std::cout << "Поток " << id << " начал обработку\n";
std::this_thread::sleep_for(std::chrono::milliseconds(100));
}

int main() {
const int num_workers = 4;
std::latch all_ready(num_workers); // Счетчик для готовности
std::latch start_work(1); // Сигнал для старта

std::vector<std::thread> threads;

// Создаем рабочие потоки
for (int i = 0; i < num_workers; ++i) {
threads.emplace_back([i, &all_ready, &start_work]() {
worker_init(i, all_ready);
worker_process(i, start_work);
});
}

// Главный поток ждет готовности всех
std::cout << "Главный поток ждет инициализации...\n";
all_ready.wait();

std::cout << "Все потоки готовы. Даем сигнал старта!\n";
start_work.count_down(); // Даем сигнал старта

for (auto& t : threads) {
t.join();
}

return 0;
}



‼️ Преимущества:

• Простая одноразовая синхронизация множества потоков
• Эффективное ожидание без активных проверок
• Идеален для сценариев типа ждать «готовности всех»
• Минимальные накладные расходы по сравнению с condition_variable


Библиотека C/C++ разработчика

#буст
Please open Telegram to view this post
VIEW IN TELEGRAM
10👍6🔥4
🍩 Фича: std::byteswap

Конвертация между little/big endian теперь можно производить за один вызов функции.


До:
uint32_t swap(uint32_t x) {
return ((x >> 24) & 0xff) | ((x << 8) & 0xff0000) |
((x >> 8) & 0xff00) | ((x << 24) & 0xff000000);
}


После:
uint32_t swapped = std::byteswap(value);



✏️ Практика:

• Сетевые протоколы
• Чтение бинарных файлов
• Кросс-платформенная сериализация

Библиотека C/C++ разработчика

#буст
Please open Telegram to view this post
VIEW IN TELEGRAM
👍53
💻 На чём вы компилируете свои проекты?

Каждому разрабу нужно только одно — рабочий компьютер. У каждого он свой. На винде, на линуксе или может даже на макОси.

На чём вы компилируете свои проекты, запускаете многопоточные монстры и дебажите сегментфолты до рассвета?

😎 Напишите какие у вас:

• модель ноутбука/десктопа
• процессор
• оперативку

👇 Похвастайтесь какие у вас комплектующие в комментариях 👇

Библиотека C/C++ разработчика

#буст
🔥1😁1
🎂 Embox v0.7.0 — RTOS с Linux-окружением без Linux

Открытая ОСРВ Embox отметила 16-летие релизом версии 0.7.0. Если вы работаете с embedded-системами, то обязательно стоит обратить внимание.

⚙️ Что интересного?

Главная фишка: запускать Linux-ПО без самого Linux. Система POSIX-совместима и поддерживает C++ из коробки.
Архитектуры: ARM, MIPS, x86, RISC-V, Microblaze, SPARC, PowerPC, E2K (Эльбрус)
Привычный workflow: аналог ./configure; make; make install
Файловые системы: FAT, ext2/3/4
Бонусом: сетевой и графический стек, плюс поддержка Python, Lua, JS, Ruby, Lisp, TCL, Scheme

Embox написана на C с гибкой конфигурацией на уровне исходников и распространяется под BSD-лицензией. Отличное решение для embedded-проектов, где нужна предсказуемость RTOS с экосистемой POSIX.

👉 Github

Библиотека C/C++ разработчика

#буст
🔥5👍2