gpt4 book ai didi

c++11 - 什么时候应该使用静态数据成员与 const 全局变量?

转载 作者:行者123 更新时间:2023-12-03 18:05:28 25 4
gpt4 key购买 nike

事实证明,声明 const 全局变量有助于确定 API 的某些功能参数。例如,在我的 API 上,数值精度运算符的最小阶数是 2;因此,我声明:

const int kDefaultOrderAccuracy{2};

作为全局变量。将其设为 static const 会更好吗?描述这些运算符的类的公共(public)数据成员?一般来说,什么时候选择一个比另一个更好?

最佳答案

const int kDefaultOrderAccuracy{2};

是静态变量的声明: kDefaultOrderAccuracy有内部联系。把 标题中带有内部链接的名称显然是一个非常糟糕的主意 ,使得在相同或其他 header 中具有外部链接的其他代码中非常容易违反单一定义规则(ODR),特别是当名称用于内联或模板函数的主体时:

f.hpp 内部:
template <typename T>
const T& max(const T &x, const T &y) {
return x>y ? x : y;
}

inline int f(int x) {
return max(kDefaultOrderAccuracy, x); // which kDefaultOrderAccuracy?
}

只要您包含 f.hpp在两个 TU(翻译单位)中, 您违反了 ODR ,因为定义不是唯一的,因为它使用命名空间静态变量: kDefaultOrderAccuracy定义指定的对象取决于编译它的 TU。

类的静态成员具有外部链接:
struct constants {
static const int kDefaultOrderAccuracy{2};
};

inline int f(int x) {
return max(constants::kDefaultOrderAccuracy, x); // OK
}

只有一个 constants::kDefaultOrderAccuracy在节目中。

您还可以使用命名空间级别的全局常量对象:
extern const int kDefaultOrderAccuracy;

关于c++11 - 什么时候应该使用静态数据成员与 const 全局变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34199960/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com