gpt4 book ai didi

c++ - 在 C++ 中定义复常量 "i"(#define vs const)

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:49:17 24 4
gpt4 key购买 nike

我想知道在 C++ 中定义复常量“i”的“最佳实践”是什么。

我知道“#define vs const in C++”这个问题已经被问过多次,一般的答案是最好使用 const.

但是,我认为使用 #define 是有意义的而不是 const定义数学常数(例如“i”或“pi”),因为我们不认为它们是变量,而是“绝对常数”(在接受的答案 here 中,可以阅读:“最好将使用 const 限定符定义的常量视为不可修改 变量。”)。另外,我在 math.h 中看到库,常量以这种方式定义,例如#define M_E 2.71828182845904523536028747135266250 /* e */ .

所以我想知道,C++ 程序员通常如何定义复常量 i?

最后,我当前的代码有一个小问题 #define I std::complex<double>(0.0, 1.0) : 预编译导致名称与我使用的 Qt 库冲突(只要我启用 C++11 支持)。

最佳答案

最佳做法是使用独特的名称或在命名空间中声明静态常量实例。


你的 #define 定义数学常数。它定义了一个扩展为 std::complex<double>(0.0, 1.0) 的宏.它们为什么不同?

1。适用范围

每次编译器找到一个名为 I 的标记时,无论它是否可以是变量名,都将被替换。不管它是类型名称、模板参数、变量还是函数参数——它都会被替换。它是否在命名空间中也没关系,因为预处理器不理解它们。您已经看到了这个 break Qt,这正是通常不推荐使用宏来声明常量的原因。

使用它们的地方,确保名称的唯一性至关重要 - 但没有简单的方法可以做到这一点。

2。语义

如果我声明一个静态常量变量(即,尽管名称不变),它就像该类型的任何实例一样可用 - 智能优化器可能会避免加载全局变量。但是,宏每次被引用时都会声明一个新的匿名临时对象。至少在某些情况下无法删除重复实例。

关于c++ - 在 C++ 中定义复常量 "i"(#define vs const),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18301163/

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