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

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

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

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

РКН: https://gosuslugi.ru/snet/67a5bac324c8ba6dcaa1ad17
Download Telegram
🍴 Макросы 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
👍6🤔4
🍴 Типичные ошибки со structured bindings

Structured bindings выглядят просто, но есть подводные камни, которые ловят даже опытные разработчики.


1️⃣ Забыли & и получили копию

struct Heavy {
std::vector<int> data{1'000'000};
};

std::pair<int, Heavy> getPair();

// Копирование элементов!
auto [id, heavy] = getPair();

// Работа через ссылку
auto& [id, heavy] = getPair();



2️⃣ Неправильное количество переменных

std::tuple<int, int, int> getCoords();

// Ошибка компиляции
auto [x, y] = getCoords(); // Нужно ровно 3 переменные!

// Правильно
auto [x, y, z] = getCoords();


3️⃣ Dangling references

//  ОПАСНО!
const auto& [x, y] = std::make_pair(1, 2);
// Временный объект уничтожен, x и y невалидны

// БЕЗОПАСНО
auto [x, y] = std::make_pair(1, 2);


4️⃣ Попытка модифицировать const

const auto [x, y] = getPair();
x = 10; // Ошибка: x — константа!

// Нужно:
auto [x, y] = getPair(); // Без const


5️⃣ Неправильные ожидания от типов

std::map<int, std::string> m{{1, "one"}};

// key имеет тип const int&, не int&!
for (auto& [key, value] : m) {
key = 2; // Ошибка компиляции!
}



✏️ Какие ошибки совершали вы? Поделитесь в комментариях!


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


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