Фиксим неприятности



Сегодня коротко разберем, как обезопасить себя от проблем кода из предыдущего поста?



Просто надо использовать inline переменные! Но для этого понадобится С++17 и выше. Их и более менее все используют, но надо оговорку сделать.



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



Поэтому код будет выглядеть вот так:



//header.hpp

inline constexpr int const_var = 3;

constexpr int gaga() {

return const_var;

}

//first.cpp

#include "header.hpp"

void boo() {

gaga();

}



//second.cpp

#include "header.hpp"

void kak_delaut_gucy() {

gaga();

}





constexpr и const имеют одинаковый линковочный смысл для переменных, поэтому замена вполне корректна. Да и просто constexpr переменная лучше смотрится с constexpr функций.



Fix your flaws. Stay cool.



#cpp17