我正在为 FRC 机器人开发一个机器人程序,并且很好奇 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);
source
文件中声明的变量,省略
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
通过引用获取其参数,因此 odr 使用内部链接 std::min
,即每个翻译单元中都有一个different变量,否认
bound
的单一定义。但在 C++20 中,您可以在 module接口单元中使用
clip
(或者,对于模块私有变量,export constexpr
),而不需要 extern constexpr
。 (使用足够现代的编译器,您可以省略
inline
。)所有这些都适用于普通
extern
(如果初始化器不是常量表达式,则必须使用),还有一个额外的好处是
const
允许您在类中定义非 inline
constexpr
类成员(即使在源文件中也很有用;将 class放在未命名的命名空间中以防止其中发生冲突案例)。