Пропустить inline
для переменных, объявленных в исходных файлах; это просто предлагает столкновения имен. В C ++ 17 добавлена поддержка встроенных переменных для файлов header : во что бы то ни стало, используйте их там, чтобы избежать таких глупостей:
#ifndef HEADER_HH
#define HEADER_HH
#include<algorithm>
/* inline */ constexpr int bound=30;
inline int clip(int x) {return std::min(x,bound);}
#endif
Любая программа, которая #include
s имеет этот заголовок в двух разных исходных файлах неверно сформирован, диагностика c не требуется (!), потому что std::min
принимает свои аргументы по ссылке и, таким образом, odr использует внутреннюю связь bound
, которая отличается переменная в каждой единице перевода, запрещающая одно определение для clip
.
В C ++ 20, однако, вы можете использовать export constexpr
(или, для частных переменных модуля, extern constexpr
) в модуль интерфейсный блок без необходимости inline
.
Все это применимо для обычного const
(как вы должны использовать, если инициализатор не является константным выражением), с добавленным Кроме того, inline
позволяет вам определять не-1026 * static
член класса внутри класса (что полезно даже в исходном файле; поместите class в анонимное пространство имен, чтобы предотвратить столкновения в этом случай).