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

时间:2013-08-18 16:16:51

标签: c++ math const c-preprocessor

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

我知道“C ++中的#define vs const”问题被多次询问,一般的答案是最好使用const.

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

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

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

1 个答案:

答案 0 :(得分:2)

最佳做法是声明一个静态const实例,使用一个独特的名称或命名空间。


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

1。范围

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

2。语义

如果我声明一个静态常量变量(即,尽管名称没有变化的变量),它就像该类型的任何实例一样可用 - 并且智能优化器可以避免加载全局变量。但是,每次引用宏时,宏都会声明一个新的匿名临时。至少会出现一些无法省略重复实例的情况。