我想知道在 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 支持)。
最佳答案
最佳实践是使用独特的名称或在命名空间中声明静态 const 实例。
您的#define
没有定义一个数学常数。它定义了一个扩展为 std::complex<double>(0.0, 1.0)
的宏。 。为什么它们不同?
1。范围
每次编译器找到名为 I
的标记时,无论是否是变量名,都会被替换。不管它是类型名称、模板参数、变量还是函数参数,它都会被替换。它是否在命名空间中也没关系,因为预处理器无法理解它们。您已经看到了 Qt 的这种中断,这正是通常不推荐使用宏来声明常量的原因。
在使用它们的地方,确保名称的唯一性至关重要 - 但没有简单的方法可以做到这一点。
2。语义
如果我声明一个静态常量变量(即,尽管名称不变的变量),它就像该类型的任何实例一样可用 - 并且智能优化器可能可以避免加载全局变量。但是,该宏每次被引用时都会声明一个新的匿名临时变量。至少在某些情况下,重复实例无法被删除。
关于c++ - 在 C++ 中定义复数常量 "i"(#define 与 const),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18301163/