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

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

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

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

РКН: https://gosuslugi.ru/snet/67a5bac324c8ba6dcaa1ad17
加入频道
📚 Загадочная библиотека setjmp.h — неочевидный инструмент для управления потоком выполнения


Библиотека setjmp.h предоставляет два необычных макроса:

setjmp — сохраняет текущее состояние программы (регистры, стек) в буфер jmp_buf

longjmp — «откатывает» выполнение к сохранённому состоянию, как прыжок во времени



#include <stdio.h>
#include <setjmp.h>

jmp_buf jump_buffer;

void risky_function() {
printf("Готовимся к прыжку...\n");
longjmp(jump_buffer, 42); // Прыжок обратно в setjmp!
}

int main() {
int ret = setjmp(jump_buffer);
if (ret == 0) {
printf("Первая инициализация...\n");
risky_function();
} else {
printf("Вернулись с кодом: %d\n", ret); // Выведет 42!
}
return 0;
}


⚠️ Осторожно!

• Не заменяет исключения — нет вызова деструкторов (как в C++)
• Опасность утечек — если между setjmp и longjmp выделялась память, она не освободится
• Портит стек — может сломать логику функций

🛠 Где может пригодиться?

• Обработка критических ошибок (а-ля «аварийный выход»)
• Код для встраиваемых систем, где нужно быстро восстановить состояние
• Нестандартные хаки (но лучше так не делать 😈)

Библиотека C/C++ разработчика
👍12🤔2❤‍🔥11🥱1
🔥 Бьярн Страуструп о будущем C++, рисках ИИ и сложности замены языка

Создатель языка C++ Бьярн Страуструп поделился своим видением «C++ 21-го века» на конференции Qt World Summit в Мюнхене.

По его словам, современный C++ — это не просто набор новых функций, а более целостный, эффективный и безопасный язык.

Страуструп рекомендует:

• Использовать более прямые конструкции вместо традиционных переменных цикла
• Применять обобщенное программирование с автоматическим выводом типов
• Никогда не использовать «сырые указатели» как ресурсные дескрипторы
• Заменить устаревшие #include на современные import

Страуструп выразил обеспокоенность влиянием ИИ на программирование: «ИИ склоняет людей к устаревшим подходам, а программисты теряют способность выявлять проблемы».

Он также скептически относится к попыткам создать языки-заменители C++: «Легко разработать что-то лучше C++ для узкой области, но одна из сильных сторон C++ — работа в самых разных доменах».

Библиотека C/C++ разработчика
👍43❤‍🔥3
⛄️ Как использовать std::span для безопасного доступа к последовательностям данных

Устали от споров «что лучше передать: вектор, массив или указатель с длиной»? C++20 предлагает элегантное решение!

#include <span>
#include <vector>
#include <array>

// Функция работает с ЛЮБЫМ непрерывным контейнером!
void processData(std::span<const int> data) {
for (const auto& item : data) {
// Обработка
}
}

int main() {
// Работает с std::vector
std::vector<int> vec = {1, 2, 3, 4, 5};
processData(vec);

// Работает с std::array
std::array<int, 3> arr = {10, 20, 30};
processData(arr);

// Работает с C-массивами
int classic[] = {100, 200, 300};
processData(classic);

// Работает с подпоследовательностями!
processData(std::span(vec).subspan(1, 3)); // Только элементы 2,3,4
}


❗️Преимущества std::span:

- Не владеет данными (zero overhead)
- Безопасно передает подпоследовательности
- Унифицированный интерфейс для всех контейнеров
- Выразительный код без шаблонных параметров

Библиотека C/C++ разработчика #буст
Please open Telegram to view this post
VIEW IN TELEGRAM
👍22
🍴Промпт для модернизация легаси кода

Есть желание использовать современные языковые фитчи, но переписывать код в ручную долго и скучно, тогда можно воспользоваться помощью искусственного интеллекта😄

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

Refactor the following code to modern [Тут напиши стандарт] programming standards:

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



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

Refactor the following code to modern c++23 programming standards:

int* createIntArray(int size) {
int* arr = new int[size];
for (int i = 0; i < size; ++i) {
arr[i] = i * i;
}
return arr;
}



Результат работы промпта:

#include <memory>
#include <vector>
#include <algorithm>

// Option 1: Return a std::vector (recommended for most cases)
auto createIntArray(int size) -> std::vector<int> {
std::vector<int> arr(size);
std::ranges::generate(arr, [i = 0]() mutable { return i * i++; });
return arr;
}

// Option 2: Return a std::unique_ptr (if you specifically need heap allocation)
auto createIntArrayUnique(int size) -> std::unique_ptr<int[]> {
auto arr = std::make_unique<int[]>(size);
for (int i = 0; i < size; ++i) {
arr[i] = i * i;
}
return arr;
}


Это достаточно простой и быстрый способ привести код к текущему стандарту. К сожалению результат работы промпта всё де придётся проверить, так как текущая реализация AI далека от идеала, но даже так времени можно сэкономить массу.

👀 А как ты приводишь свой код к более современному виду? Делитесь в комментариях!

Библиотека C/C++ разработчика #буст
Please open Telegram to view this post
VIEW IN TELEGRAM
🥱11🔥31👍1
🔬 GoogleTest — полнофункциональный фреймворк для тестирования C++ кода от Google

GoogleTest (GTest) — это мощный и гибкий фреймворк для модульного тестирования C++ кода, разработанный Google. Он предоставляет богатый набор утверждений, фикстур, моков и других инструментов, которые помогают писать эффективные и поддерживаемые тесты для сложных проектов.

✏️ Установка:

# Через vcpkg
vcpkg install gtest

# Через conan
conan install gtest/1.16.0

# Сборка из исходников
git clone https://github.com/google/googletest.git
cd googletest
mkdir build && cd build
cmake ..
cmake --build .


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

// Базовый тест
#include <gtest/gtest.h>

TEST(StringTest, StringEquality) {
std::string actual = "Hello";
actual += " World";
EXPECT_EQ(actual, "Hello World");
}

int main(int argc, char **argv) {
::testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}


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

— Фикстуры для повторного использования настроек теста
— GoogleMock для создания моков и стабов
— Параметризованные тесты
— Расширенные отчеты о результатах тестирования

⬆️ Параметризованные тесты:

class MathTest : public ::testing::TestWithParam<std::tuple<int, int, int>> {};

TEST_P(MathTest, Addition) {
int a = std::get<0>(GetParam());
int b = std::get<1>(GetParam());
int expected = std::get<2>(GetParam());
EXPECT_EQ(a + b, expected);
}

INSTANTIATE_TEST_SUITE_P(
AdditionTests,
MathTest,
::testing::Values(
std::make_tuple(1, 1, 2),
std::make_tuple(5, 3, 8),
std::make_tuple(-1, 1, 0)
)
);


🍴Ссылочки:

👉
GitHub

Библиотека C/C++ разработчика
#буст
Please open Telegram to view this post
VIEW IN TELEGRAM
🥰41👍1