【问题标题】:Defining the complex constant "i" in C++ (#define vs const)在 C++ 中定义复杂的常量“i”(#define vs const)
【发布时间】:2013-08-18 16:16:51
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 在 C++11 中,您可以在正确的上下文中使用 {0, 1}...
  • 真的,为什么?你有解释这个的链接吗?
  • 最后一个问题正是为什么最好避免使用宏:它们不尊重语言级别的概念,例如范围。他们只是对在任何情况下使用该名称而呕吐。
  • @Seub:这只是新的大括号初始化语法...
  • 我明白了,谢谢!不过,我想我仍然想定义 i。

标签: c++ math constants c-preprocessor


【解决方案1】:

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


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

1。范围

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

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

2。语义

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

【讨论】:

  • 我认为 C++ 中不需要静态?
  • @Seub: static 有不同的用途,具体取决于它的使用方式。在一个类中,它允许成员的一个实例。在翻译单元(独立)范围内声明时,它会限制项目的可见性(访问)。
  • 我的意思是,我认为static const 不需要,只需const 就可以了吗?
  • 是的,没关系,我只是从习惯中添加了一个无用的static
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-06-13
  • 2012-06-24
  • 1970-01-01
  • 2021-02-14
  • 2017-02-15
  • 1970-01-01
相关资源
最近更新 更多