Использование inline и constexpr в C ++ - PullRequest
3 голосов
/ 01 апреля 2020

Я работаю над роботизированной программой для FR C робототехники, и мне было любопытно, подходят ли inline, constexpr или оба для объявления констант.

inline constexpr double PI = wpi::math::pi 
inline constexpr double TWO_PI = 2.0 * wpi::math::pi;
inline constexpr units::radian_t PI_RAD = units::radian_t(PI);
inline constexpr units::radian_t TWO_PI_RAD = units::radian_t(TWO_PI);

1 Ответ

1 голос
/ 01 апреля 2020

Пропустить 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 в анонимное пространство имен, чтобы предотвратить столкновения в этом случай).

...