C++ 在C++;

C++ 在C++;,c++,constants,inline,constexpr,C++,Constants,Inline,Constexpr,我正在为FRC robotics开发一个机器人程序,我很好奇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_

我正在为FRC robotics开发一个机器人程序,我很好奇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);


对于源文件中声明的变量,省略
inline
;它只会引起名称冲突。C++17增加了对头文件内联变量的支持:尽一切可能在那里使用它来避免像这样愚蠢的事情:

#ifndef HEADER_HH
#define HEADER_HH
#include<algorithm>
/* inline */ constexpr int bound=30;
inline int clip(int x) {return std::min(x,bound);}
#endif
#ifndef头
#定义标题
#包括
/*inline*/constexpr int-bound=30;
内联int-clip(intx){return std::min(x,bound);}
#恩迪夫
任何
#在两个不同的源文件中包含此头的程序都是格式不正确的,不需要诊断(!),因为
std::min
通过引用获取其参数,因此odr使用内部链接
bound
,这是每个翻译单元中不同的变量,拒绝
剪辑的单个定义

不过,在C++20中,您可以在模块接口单元中使用
export constexpr
(或者,对于模块专用变量,
extern constexpr
),而无需
内联


所有这些都适用于普通的
const
(如果初始值设定项不是一个常量表达式,则必须使用),另外还有一个额外的好处,即
inline
允许您在类内定义一个非
constepr
静态
类成员(即使在源文件中也很有用;将类放在匿名命名空间中以防止在这种情况下发生冲突).

constepr
意味着
inline
我相信。@0x5453这只适用于函数和静态数据成员,而不适用于命名空间级别的变量。对于命名空间级别的变量,
constepr
意味着内部链接。OP:如果你问一个具体的问题会更好,否则这主要是意见问题在我看来,我只会使用
constepr
,而不是
inline
。通常不需要基本的数学常数具有外部链接。