Библиотека C/C++ разработчика | cpp, boost, qt
Все самое полезное для плюсовика и сишника в одном канале. По рекламе: @proglib_adv Учиться у нас: https://proglib.io/w/d6cd2932 Для обратной связи: @proglibrary_feeedback_bot РКН: https://gosuslugi.ru/snet/67a5bac324c8ba6dcaa1ad17 #WXSSA
Больше📈 Аналитический обзор Telegram-канала Библиотека C/C++ разработчика | cpp, boost, qt
Канал Библиотека C/C++ разработчика | cpp, boost, qt (@cppproglib) языкового сегмента Русский является активным участником. Сейчас сообщество объединяет 17 823 подписчиков, занимая 5 866 место в категории Технологии и приложения и 28 983 место в регионе Россия.
📊 Показатели аудитории и динамика
С момента создания невідомо проект демонстрирует стремительный рост, собрав аудиторию из 17 823 подписчиков.
Согласно последним данным от 05 июня, 2026, канал показывает стабильную активность. За последние 30 дней изменение числа участников составило -10 788, а за последние 24 часа — -8, при этом общий охват остаётся высоким.
- Статус верификации: Не верифицирован
- Уровень вовлечённости (ER): Средний показатель вовлечённости аудитории составляет 6.89%. В первые 24 часа после публикации контент обычно набирает 4.01% реакций от общего числа подписчиков.
- Охват публикаций: В среднем каждый пост получает 1 597 просмотров. В течение первых суток публикация набирает 931 просмотров.
- Реакции и взаимодействия: Аудитория активно поддерживает контент: среднее количество реакций на один пост — 9.
- Тематические интересы: Контент сосредоточен на ключевых темах, таких как c++, навигация, компилятор, удалёнка, developer.
📝 Описание и контентная политика
Автор описывает ресурс как площадку для выражения субъективного мнения:
“Все самое полезное для плюсовика и сишника в одном канале.
По рекламе: @proglib_adv
Учиться у нас: https://proglib.io/w/d6cd2932
Для обратной связи: @proglibrary_feeedback_bot
РКН: https://gosuslugi.ru/snet/67a5bac324c8ba6dcaa1ad17
#WXSSA”
Благодаря высокой частоте обновлений (последние данные получены 07 июня, 2026) канал поддерживает актуальность и высокий уровень охвата публикаций. Аналитика показывает, что аудитория активно взаимодействует с контентом, что делает его важной точкой влияния в категории Технологии и приложения.
purego решает всё это, позволяя вызывать C-функции из чистого Go.
Откуда взялся проект
Библиотека выросла из игрового движка Ebitengine. Его авторы портировали движок на чистый Go для Windows, что позволило кросс-компилировать на Windows с любой ОС одной командой GOOS=windows. purego родился, чтобы принести тот же подход на macOS, Linux и другие платформы.
Что даёт purego
Без Cgo отпадает необходимость в C-компиляторе. Вы можете собирать проект под другую платформу, просто задав GOOS и GOARCH. Сборка кешируется целиком как обычный Go-проект и работает быстрее. Бинарники становятся меньше, потому что Cgo генерирует обёртку на C для каждого вызова, а purego этого не делает.
Ещё purego умеет загружать символы из shared-библиотек в рантайме. Это можно использовать как систему плагинов или для FFI-вызовов в библиотеки на других языках, скомпилированные в .so / .dylib / .dll.
purego работает и при CGO_ENABLED=1. Это значит, что можно портировать проект с Cgo на purego постепенно, не переписывая всё разом.
Как это выглядит в коде
API минимальный. Вы открываете библиотеку через Dlopen, затем регистрируете Go-функцию, которая будет вызывать C:
package main
import (
"fmt"
"runtime"
"github.com/ebitengine/purego"
)
func getSystemLibrary() string {
switch runtime.GOOS {
case "darwin":
return "/usr/lib/libSystem.B.dylib"
case "linux":
return "libc.so.6"
default:
panic(fmt.Errorf("GOOS=%s is not supported", runtime.GOOS))
}
}
func main() {
libc, err := purego.Dlopen(getSystemLibrary(), purego.RTLD_NOW|purego.RTLD_GLOBAL)
if err != nil {
panic(err)
}
var puts func(string)
purego.RegisterLibFunc(&puts, libc, "puts")
puts("Calling C from Go without Cgo!")
}
Обратите внимание на RegisterLibFunc. Вы объявляете переменную с нужной Go-сигнатурой, а purego привязывает её к C-функции по имени. Никаких // #cgo директив, никаких .h файлов.
Когда стоит использовать
purego подходит, если вам нужно вызывать C-библиотеку из Go и при этом важна простота сборки и кросс-компиляция. Типичные сценарии — работа с системными библиотеками, графические движки, аудио, нативные SDK.
Если ваш проект уже плотно завязан на Cgo и работает на одной платформе, смысла переезжать может не быть. Но если вы начинаете новый проект или хотите избавиться от зависимости на C-тулчейн, purego стоит попробовать.
➡️ Репозиторий
📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека Go-разработчика
#GoToProductionswitch-case для превращения enum в строку. C++26 предлагает забыть об этом — в стандарт входит compile-time reflection.
• Появляются два новых оператора: ^^ (reflection operator) и [: :] (splicer). Первый превращает любую C++-сущность — тип, переменную, namespace, шаблон — в значение std::meta::info на этапе компиляции. Второй делает обратное: конвертирует std::meta::info обратно в тип, выражение или шаблон
• std::meta::info — это constexpr-хэндл к сущности. По сути, программа получает возможность исследовать собственную структуру в compile-time, не прибегая к макросам или кодогенерации
• Практический пример — generic to_enum_string(). Через std::meta::enumerators_of(^^T) получаем список enumerator-ов, итерируемся по ним с помощью template for, сплайсим значение через [:e:] и достаём имя через std::meta::identifier_of. Добавил новый enumerator — всё работает автоматически
• Для итерации используется std::define_static_array — отдельный proposal C++26, без которого развернуть expansion statement пока не получится
Вместо ручного switch-case, который ломается при каждом добавлении нового значения, reflection даёт обобщённое решение на уровне языка. Никакой кодогенерации, никаких макросов — чистый constexpr-код с полной type safety.
🍴 Подробнее
📍Навигация: Вакансии • Задачи • Собесы
Библиотека C/C++ разработчика
#бустstd::vector<std::string> names = {"Алиса", "Борис", "Виктор"};
std::vector<int> scores = {95, 82, 78};
// Получаем пары (имя, балл)
for (auto [name, score] : views::zip(names, scores)) {
std::cout << name << ": " << score << "\n";
}
// Алиса: 95
// Борис: 82
// Виктор: 78
zip заканчивается на самом коротком диапазоне — безопасно при разной длине. Внутри возвращается std::tuple, а structured bindings разбирают его на отдельные переменные.
❗️ views::zip возвращает ссылки на элементы исходных контейнеров. Модификация через structured binding изменит оригинальные данные.
🥨 views::enumerate — индекс + значение (C++23)
std::vector<int> data = {10, 50, 30, 90, 20};
for (auto [i, val] : data | views::enumerate) {
if (val > 40) {
std::cout << "Первое превышение на позиции " << i << "\n";
break;
}
}
// Первое превышение на позиции 1
Раньше для этого приходилось писать views::zip(views::iota(0), data) (см. предыдущий пост про генераторы). Теперь — в одну строку.
❗️ Тип индекса в enumerate — это range_difference_t, а не int или size_t. На практике разница редко бьёт, но при сравнении с size() компилятор может выдать предупреждение о знаковости.
🧊 Главное свойство
Как и все views, zip и enumerate ленивые — они не создают копий и не выделяют память. Это лёгкие обёртки поверх исходных данных, которые вычисляются только при обращении к элементу.
📍Навигация: Вакансии • Задачи • Собесы
Библиотека C/C++ разработчика
#константная_правильностьiostream и статической линковкой на GCC 15 выдаёт бинарник в 2,3 МБ. Для вывода 11 символов — как-то многовато.
• iostream тянет за собой инициализацию std::cout, std::stringstream, локали, виртуальные функции и шаблоны — всё это ради одного вызова operator<<. Замена на printf сразу роняет размер до 42,5 КБ
• Флаг -s срезает ~1,2 МБ отладочной информации, которую компилятор зачем-то пихает в релизный бинарник по умолчанию
• Тенденция по версиям GCC показательна: тот же iostream-бинарник на GCC 3.4.2 весил 260 КБ, на 15.2.0 — уже 1,05 МБ. С каждой версией зависимости жиреют
Принцип «не плати за то, что не используешь» на практике работает ровно до того момента, пока компилятор сам не решит, что тебе нужно.
👉 Более детальный разбор
✏️ Вы проверяли, сколько весит ваш «минимальный» бинарник?
📍 Навигация: Вакансии • Задачи • Собесы
Библиотека C/C++ разработчика
#буст- Разберем реальные кейсы стартапов и ограничения LLM. - Обсудим рабочие архитектуры: RAG, human-in-the-loop, контроль качества. - Ответим на ваши вопросы и разберем кейсы участников.🎁 Бонусы: в конце вебинара подарим промокод на скидку 10.000 ₽ на курсы и разыграем подписки на полезные AI-сервисы. 👉 Зарегистрироваться на вебинар
// Реализуй класс LRUCache:
// - LRUCache(int capacity)
// - int get(int key) // O(1)
// - void put(int key, int val) // O(1)
//
// При переполнении вытесняется
// наименее недавно использованный элемент.
//
// Разрешено использовать STL.
✏️ Реализуй. Объясни выбор структур данных и почему сложность O(1).
📍Навигация: Вакансии • Задачи • Собесы
Библиотека C/C++ разработчика
#константная_правильностьRanges умеют генерировать их на лету — без выделения памяти под вектор. Разберём два главных генератора.
🍕 views::iota — числовой диапазон
Генерирует последовательность чисел в полуоткрытом интервале [start, end):
// Числа от 0 до 9
for (int i : views::iota(0, 10)) {
std::cout << i << " "; // 0 1 2 3 4 5 6 7 8 9
}
Можно передать только одно значение — получится бесконечная последовательность:
auto naturals = views::iota(1); // 1, 2, 3, 4, ...
auto first_10 = naturals | views::take(10);
❗️ Бесконечный диапазон обязательно нужно ограничить — например, через views::take.
🌳 Индексированный обход (zip + iota)
До появления views::enumerate пару (индекс, значение) получали через views::zip с iota:
std::vector<std::string> fruits = {"яблоко", "банан", "вишня"};
for (auto [i, fruit] : views::zip(views::iota(0), fruits)) {
std::cout << i << ": " << fruit << "\n";
}
// 0: яблоко
// 1: банан
// 2: вишня
В C++23 для этого есть views::enumerate — но zip + iota по-прежнему работает и даёт понять, как устроена индексация изнутри.
🍙 views::repeat — повторение значения (C++23)
Генерирует бесконечный поток из одного и того же значения:
for (int x : views::repeat(0) | views::take(5)) {
std::cout << x << " "; // 0 0 0 0 0
}
Или сразу с ограничением — передаём второй аргумент:
for (auto s : views::repeat("hello", 3)) {
std::cout << s << " "; // hello hello hello
}
❗️ Форма с двумя аргументами появилась в C++23 и возвращает конечный диапазон — views::take не нужен.
📍Навигация: Вакансии • Задачи • Собесы
Библиотека C/C++ разработчика
#константная_правильностьF11 (Step Into) в Visual Studio, отладчик проваливается в каждую функцию — включая стандартную библиотеку, runtime и сторонний код?
Функция Just My Code решает эту проблему. При включении отладчик автоматически перешагивает через код, который не принадлежит вашему проекту — будь то STL, CRT или любые внешние библиотеки.
🍀 Включить просто:
Tools → Options → Debugging → General → Enable Just My Code
🍬 Пример:
#include <vector>
#include <algorithm>
#include <iostream>
int doubleValue(int x) {
return x * 2; // ← ВАШ код
}
int main() {
std::vector<int> v = {3, 1, 4, 1, 5};
// F11 здесь без JMC → провалится в std::sort
std::sort(v.begin(), v.end());
// F11 здесь без JMC → провалится в std::transform
std::transform(v.begin(), v.end(), v.begin(), doubleValue);
return 0;
}
Без JMC: F11 на std::sort уводит вас в дебри introsort внутри STL.
С JMC: отладчик перепрыгивает sort и останавливается на следующей вашей строке.
📍Навигация: Вакансии • Задачи • Собесы
Библиотека C/C++ разработчика
#буст
Уже доступно! Исследование Telegram 2025 — ключевые инсайты года 
