Библиотека 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
🔥 Inline static в классах — забудь про .cpp

Сколько раз ты забывал добавить определение static члена в .cpp, и компилятор радостно выдавал undefined reference?


С C++17 можно просто добавить inline к static переменной класса, и всё работает. Особенно круто это для счётчиков, кешей и паттерна Registry.

// До C++17
class Logger {
public:
static std::ofstream log_file; // объявление
static int message_count; // объявление
};
// В .cpp обязательно нужны определения:
// std::ofstream Logger::log_file{"app.log"};
// int Logger::message_count = 0;

// С C++17
class Logger {
public:
inline static std::ofstream log_file{"app.log"};
inline static int message_count = 0;
inline static std::mutex log_mutex;

static void log(const std::string& msg) {
std::lock_guard lock(log_mutex);
log_file << "[" << message_count++ << "] " << msg << '\n';
}
};
// Никаких дополнительных файлов!


❗️Теперь весь класс может жить в заголовочном файле, что идеально для template классов и header-only библиотек. Инициализация происходит при первом использовании, потокобезопасно и предсказуемо.

🐸 Рефактори свои старые классы — убери лишние .cpp файлы и наслаждайся чистым кодом.

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

#шаблонный_код
Please open Telegram to view this post
VIEW IN TELEGRAM
👍161
🍴 Макросы 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
👍3🤔3