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

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

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

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

РКН: https://gosuslugi.ru/snet/67a5bac324c8ba6dcaa1ad17

#WXSSA
Download Telegram
🍬 Почему assert() убивает тесты, а ASSERT_EQ не трогает другие?

assert() крашит процесс. ASSERT_EQ() — нет. Оба проверяют условия. В чём разница на уровне исполнения?
Механизм обработки неудачи в Google Test построен на исключениях и return, а не на abort().

⚡️ Как работает assert():
#define assert(expr) \
((expr) ? (void)0 : __assert_fail(...))


При провале вызывается __assert_fail(), которая делает abort() — немедленное завершение процесса. Никаких cleanup, никаких других тестов.

🔍 Как работает ASSERT_EQ:

#define ASSERT_EQ(a, b) \
if (auto result = Compare(a, b); !result) { \
RecordFailure(result); \
return; // <-- ключевое!
}


✏️ При провале:

1. Ошибка записывается в объект теста
2. Выполняется return из функции теста
3. Фреймворк перехватывает управление
4. Следующий тест запускается нормально

🪐 Технический нюанс:

В helper-функциях ASSERT_* использует специальный механизм — макрос генерирует код, который бросает внутреннее исключение Google Test, если тест не void. Это позволяет прервать выполнение даже из вложенных функций.

🍋 Практический вывод:

Никогда не используй assert() в production коде, который тестируешь — это помешает тестированию граничных случаев. Используй throw или возвращай error codes.

В тестах всегда используй ASSERT_*/EXPECT_*, а не assert().

📍Навигация: ВакансииЗадачиСобесы

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

#буст
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥7👍2🥱1
🔧 Guidelines Support Library: как Microsoft проверяет параметры

GSL — это не просто модная библиотека. Это набор практик от создателей C++, упакованный в код😎

#include <gsl/gsl>

// Традиционная проверка
void setAge(Person& p, int age) {
if (age < 0 || age > 150) {
throw std::invalid_argument("Invalid age");
}
p.age = age;
}

// GSL: семантика ясна из кода
void setAge(Person& p, int age) {
Expects(age >= 0 && age <= 150); // Precondition
p.age = age;
Ensures(p.age == age); // Postcondition
}


❗️Что даёт GSL:

Expects() — preconditions (проверка входа)
Ensures() — postconditions (проверка выхода)
gsl::not_null<T*> — указатель, который не может быть null

void process(gsl::not_null<int*> data) {
// Компилятор гарантирует: data != nullptr
*data = 42; // Безопасно без if
}


‼️ В debug режиме — runtime проверки, в release — могут быть отключены.

👉 Библиотека

📍Навигация: ВакансииЗадачиСобесы

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

#константная_правильность
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3🙏2