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

标签 c++ math constants c-preprocessor

我想知道在 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/

相关文章:

c++ - const 参数传递 : invalid conversion

c++ - for 循环不会从 i = 0 开始

c++ - 在 C 中声明结构的新实例

c++ - 如何使用基类的接口(interface)?

c++ - Casteljau 算法 - 实例

c++ - 需要帮助理解 C++ 中的数学

algorithm - 表达式评估

c++ - VC++ 2010的另一个BUG?关于在 header 中声明常量 REFERENCE

c++ - 一行和两行声明之间的区别?

perl - 为什么 Perl 会提示 "Useless use of a constant in void context",但只是有时?