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

Как запустить своего ии-агента: https://clc.to/tvpmDQ

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

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

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

#WXSSA
Download Telegram
#c_language #algorithms

Реализация алгоритма сортировки пузырьком на языке Си:

#define SWAP(A, B) { int t = A; A = B; B = t; }

void bubblesort(int *a, int n)
{
int j, nn;

do {
nn = 0;
for (j = 1; j < n; ++j)
if (a[j-1] > a[j]) {
SWAP( a[j-1], a[j] );
nn = j;
}
n = nn;
} while (n);
}
👍1
С-трюк: Расчет времени между событиями
Фрагмент кода для расчета времени, прошедшего между двумя событиями (к примеру, чтобы выяснить, сколько времени займет выполнение чего-либо).

#include "stdafx.h"
#include <time.h>
#include <windows.h>
#include <stdlib.h>
clock_t startm, stopm;
#define BEGIN if ( (startm = clock()) == -1) \
{ \
printf("clock returned error.");exit(1); \
} \
#define CLOSE if ( (stopm = clock()) == -1) \
{printf("clock returned error."); \
exit(1); \
} \
#define SHOWTIME printf( "%6.3f seconds elapsed.", ((double)stopm-startm)/CLOCKS_PER_SEC);



main() {
BEGIN;
// Specify set of instructions for you want to measure execution time
Sleep(10);
CLOSE;
SHOWTIME;
}
🍔 Отладочные макросы

Отладочные макросы в C++ используются для упрощения процесса отладки и диагностики программного кода

Основные отладочные макросы включают assert, static_assert и пользовательские макросы

🍓 assert

Макрос assert определён в заголовочном файле <cassert> и используется для проверки логических выражений во время выполнения программы. Если выражение вернёт false, assert завершает выполнение программы и выводит сообщение об ошибке
#include <cassert>

void test(int x) {
assert(x > 0 && "x must be positive");
// остальной код функции
}

int main() {
test(5); // проходит проверку
test(-3); // приводит к ошибке во время выполнения
return 0;
}


🍒 static_assert

static_assert введён в C++11 и позволяет проверять условия на этапе компиляции. Это особенно полезно для проверки условий, которые должны выполняться всегда, независимо от состояния программы во время выполнения
#include <type_traits>

template <typename T>
void check() {
static_assert(std::is_integral<T>::value, "T must be an integral type");
}

int main() {
check<int>(); // проходит проверку
check<float>(); // ошибка компиляции: T must be an integral type
return 0;
}


🫐 Пользовательские отладочные макросы

Вы также можете определять собственные макросы для отладки, которые помогут вам выводить дополнительную информацию или выполнять специфические проверки

#include <iostream>

#define DEBUG

#ifdef DEBUG
#define DEBUG_PRINT(x) std::cout << x << std::endl
#else
#define DEBUG_PRINT(x)
#endif

int main() {
int value = 42;
DEBUG_PRINT("Value: " << value);
return 0;
}
👍95
🍔 Как выстрелить себе в ногу в C и C++. Сборник рецептов Haiku OS

Статья о нюансах языка с которыми лучше быть поаккуратнее:
• Неинициализированные переменные
• Подозрительный #define
• Ошибки с функцией free
• Ошибки с оператором delete
• Функции без возвращаемого значения
• Работа с исключениями
• Сравнения с беззнаковыми переменными
• Опасные указатели

👉 Ссылочка
👍12🥱1
🍴 Макросы vs Inline: битва прошлого века

В legacy коде до сих пор встречаются макросы вместо inline функций. И это проблема.

Макросы — это текстовая подстановка препроцессором до компиляции.

Классический пример:
cpp #define SQUARE(x) x*x


Выглядит невинно, но вызов SQUARE(a+b) развернется в a+b*a+b вместо (a+b)*(a+b). Проблемы с приоритетом операций, отсутствие type safety, невозможность отладки — список можно продолжать.

Inline функции решают все эти проблемы. Они проверяются компилятором на типы, поддерживают перегрузку, могут использовать пространства имен и классы. Отладчик понимает их как обычные функции. А современные компиляторы оптимизируют их так же эффективно, как макросы, но безопаснее.

Единственное преимущество макросов — работа с любыми типами без шаблонов. Но с появлением constexpr и шаблонов в C++11/14/17 даже это преимущество исчезло.

Вы всё ещё пишете макросы для "быстрых" функций или давно перешли на inline/constexpr?

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

#междусобойчик
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7🤔41
🍬 Почему 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👍3🥱1
🔥 Препроцессор C++ — наследие, от которого не сбежать

Несмотря на все усилия комитета по стандартизации, #include и #define по-прежнему живут в каждом проекте. Препроцессор — это, по сути, отдельный язык, работающий до компиляции, и он ничего не знает о типах, областях видимости и прочих правилах C++.

Главная проблема — текстовая подстановка. Макрос не проверяет типы, не уважает пространства имён и может сломать код в самом неожиданном месте. Классический пример: #define max(a,b) ((a)>(b)?(a):(b)) — попробуйте передать туда i++, и получите двойной инкремент.

Современный C++ предлагает альтернативы почти для каждого сценария: constexpr, consteval, inline-функции, шаблоны. Но полностью убить препроцессор пока не удалось.


✏️ А в вашем проекте много макросов, или удалось от них почти избавиться?


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

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

#междусобойчик
Please open Telegram to view this post
VIEW IN TELEGRAM
9😁3