在 C++ 中使用 inline 和 constexpr

问题描述 投票:0回答:1

我正在为 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);

c++ constants inline constexpr
1个回答
5
投票
对于在

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
放在未命名的命名空间中以防止其中发生冲突案例)。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.