2

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

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

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

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

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

4

1 回答 1

2

最佳实践是声明一个静态 const 实例,具有独特的名称或在命名空间中。


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

一、范围

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

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

2. 语义

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

于 2013-08-18T17:12:46.503 回答