定义复常数;我";在C++;(#定义vs常量) 我想知道什么是“最佳实践”来定义C++中的复数常量“i”。

定义复常数;我";在C++;(#定义vs常量) 我想知道什么是“最佳实践”来定义C++中的复数常量“i”。,c++,math,constants,c-preprocessor,C++,Math,Constants,C Preprocessor,我知道“C++中的#definevsconst”问题已经被问了很多次,一般的答案是最好使用const. 然而,我认为使用#define而不是const来定义数学常数(如“I”或“pi”)是有意义的,因为我们不认为它们是变量,而是“绝对常数”(在公认的答案中,可以读到:“用常量限定符定义的常量最好被认为是一个不可修改的变量”)。此外,我在math.h库中看到,常量是这样定义的,例如#define M#e 2.71828182845904535360287135266250/*e*/ P> >我想

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

然而,我认为使用
#define
而不是
const
来定义数学常数(如“I”或“pi”)是有意义的,因为我们不认为它们是变量,而是“绝对常数”(在公认的答案中,可以读到:“用常量限定符定义的常量最好被认为是一个不可修改的变量”)。此外,我在
math.h
库中看到,常量是这样定义的,例如
#define M#e 2.71828182845904535360287135266250/*e*/

<> P> >我想知道,C++程序员通常如何定义复合常数i?< /p>
最后,我的当前代码有一个小问题
#define I std::complex(0.0,1.0)
:预编译会导致与我使用的Qt库发生名称冲突(只要我启用C++11支持)。

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


您的
#define
没有定义数学常数。它定义了一个扩展到
std::complex(0.0,1.0)
的宏。为什么它们不同

1.范围 每次编译器找到名为
I
的标记时,无论它是否是变量名,都将被替换。不管它是类型名、模板参数、变量还是函数参数,都将被替换。不管它是否在命名空间中,因为预处理器不理解它们。您有一个lready已经看到了这个中断Qt,这正是宏通常不赞成声明常量的原因

在使用它们的地方,确保名称的唯一性是至关重要的,但要做到这一点并不容易

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

在C++11中,您可以使用
{0,1}
在正确的上下文中…真的吗?为什么?你有一个链接来解释这一点吗?最后一个问题就是为什么最好避免使用宏:它们不尊重语言级别的概念,例如作用域。它们只是对在任何上下文中使用该名称感到恶心。@Seub:这只是新的大括号初始化语法…我明白了,谢谢!我想我还是要定义它但是,我认为C++中不需要静态的。@ SUB:<代码>静态<代码>取决于它是如何使用的。在一个类中,它允许一个实例的成员。当在翻译单元的范围内声明(自由站立)时,它限制了可见性(访问)。我的意思是,我认为不需要
静态常量
,只要
常量
就可以了?是的,那很好,我只是习惯性地添加了一个无用的
静态