Сколько раз ты забывал добавить определение 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';
}
};
// Никаких дополнительных файлов!
Библиотека C/C++ разработчика
#шаблонный_код
Please open Telegram to view this post
VIEW IN TELEGRAM
👍16❤1
В 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